2015-12-09 16 views
12

Ho un'implementazione di una casella di testo che usa pango. Se metto una stringa che inizia con una parola nello script da destra a sinistra, seguita da uno spazio, seguita da una parola in uno script da sinistra a destra, la parola wrapping utilizzata da pango viene incasinata (usando PANGO_WRAP_WORD_CHAR). Per la stringa العربية INGLESE ottengo il seguente:Word wrapping in pango con script misti

Bad word wrapping

Se aggiungo il carattere unicode U+200F dopo lo spazio, tanto sono il ritorno a capo atteso:

Expected word wrapping

anche , se sostituisco lo script arabo sopra con Hindi (che è sinistra-destra come l'inglese accanto ad esso) allora ho ancora il problema, quindi non sembra essere strettamente da sinistra a destra, a destra- cosa a sinistra Nel caso Hindi, inserisco un hack che inserisce uno 0x200E dopo che lo spazio ha risolto il problema.

È un errore nel pango? Sono possibili soluzioni che sono abbastanza generiche per risolvere il problema ma non per rompere gli altri casi? Il lavoro corrente su I sta usando gli inserti sia uno 0x200E o 0x200F dopo ogni spazio basato sulla direzione del carattere fortemente diretto precedente nella stringa, ma non sono sicuro se ci sono certe stringhe che causeranno problemi con questo.

Aggiornamento: Sono stato in grado di riprodurre il problema su Ubuntu 12.04 con gedit (con Abilita Disposizione testo e fare nessuna parola suddiviso su due linee impostazioni abilitate). Ho semplicemente digitato più volte lo Hello world finché non lo ha riavvolto diverse volte, quindi ho sostituito tutte le istanze di world con पहुंचगया e tutto è collassato su una singola riga.

+0

il problema pango cose che una parola LTR dopo parola RTL (o l'inverso) come una parola, quindi non si romperà su due se si sceglie wrap su parole. –

+0

Ho aggiornato la domanda per menzionare che il problema si verifica anche quando ho solo script LTR alternati (ad esempio inglese e hindi) – pauld

risposta

6

I simboli U+200F e U+200E sono marchi DESTRO-A-SINISTRA e SINISTRA-DESTRA. S:

  • tra ogni testo in inglese e il testo in arabo, mise un segno da destra a sinistra
  • tra ogni testo arabo e il testo inglese, mettere un segno lasciato a destra

E ' è un errore perché Pango dovrebbe automaticamente visualizzare il testo, ma poiché Pango non lo fa, dovresti farlo manualmente.

+0

Grazie. Sto cercando di capire se questo è un bug in Pango o se questi simboli sono richiesti. Se metto lo stesso testo in una casella di testo parola microsoft o in una casella di testo Qt, i risultati sono quelli che mi aspetto (assomigliano all'immagine in basso). – pauld

5

Mi sembra un bug o una funzionalità non completa come appare negli script misti.

Mi sembra che si stia utilizzando un vecchio sviluppo di pango, potrebbe provenire da Ubuntu 12.04?

Ubuntu 12.04 contains Gedit 3.4 
Ubuntu 15.10 contains Gedit 3.10 

Pango ha cambiamento radicale nella 3.6, ha sostituito il suo motore sagomatura con HarfBuzz. [2]

Non riesco a riprodurre il bug utilizzando Gedit 15.10, sposta sempre (2) due parole in basso, inoltre non mi consente di ridimensionare la finestra per provare a suddividere queste due parole. Vedi screenshot.

pango shaping mixed scripts in gedit

Aggiornamento:

Sembra il suo comportamento è cambiato:

  • Non avvolgere la prima parola da uno script inglese quando inizio con l'arabo.

    pango-view --text "وقعت أطراف سياسية ليبية اليوم في المغرب اتفاق سلام برعاية أممية aljazeeranet" --width=70 --margin=0 --wrap=word 
    

    enter image description here

  • Esso stesso caso precedente, non si avvolge, e applicare la larghezza

    pango-view --text "elections الجزيرة" --width=30 --margin=0 --wrap=word 
    

    enter image description here

Riferimenti:

+2

Grazie per l'aiuto. Dopo il tuo post, ho provato questo in gedit di ubuntu 15.1 e ottengo lo stesso risultato (usando il caso di test del mondo ciao che ho menzionato sopra). – pauld

+0

Inoltre non sono sicuro di quale versione di pango ubuntu 15.1 stia usando. Cercando il pango da/usr/lib', l'unica libreria di pango che vedo è 'libpango-1.0.so.0' (e alcuni altri con versioni simili) – pauld

+1

@pauld, ok potrei riprodurlo, non ho notato '--wrap = word', dato che la tua domanda era chiara sulla modalità di avvolgimento di' word-char'. Stesso comportamento in Ubuntu 15.10. Quindi questa risposta è irrilevante per il problema che rimuoverò in seguito. Dovrei aggiungere il suo non solo con 'U + 200F' e' U + 200E', ma qualsiasi carattere di controllo rende la parola inglese wrap. quello che ho testato finora 'U + 202C',' U + 061C', 'U + 202A',' U + 2069', e la stessa cosa accade quando si scambia la parola inglese 1a e poi la 2a araba. –

0

Nota, abbiamo recentemente aggiornato la versione di Pango abbiamo utilizzato, da Pango versione 1.36.1 a 1.38.1, e questo problema è andato via. Quindi credo che questo sia stato un bug in pango o harfbuzz che da allora è stato risolto.