2015-12-09 32 views
12

我有一個使用pango的文本框實現。如果我把一個字符串從右到左腳本中的一個單詞開頭,後跟一個空格,然後是從左到右的單詞,那麼pango使用的單詞會變得混亂(使用PANGO_WRAP_WORD_CHAR)。對於字符串العربيةENGLISH我得到如下:用混合腳本在pango中換行

Bad word wrapping

如果我的空間之後添加的Unicode字符U+200F,然後我得到了預期的自動換行:

Expected word wrapping

而且,如果我用印地語替換上面的阿拉伯語腳本(從左到右像英語旁邊的那樣),那麼我仍然會遇到問題,所以它似乎不是一個嚴格的從左到右,左至右的東西。在印度語的情況下,我放入一個黑客,在解決問題的空間之後插入0x200E

這是一個在pango中的錯誤?是否有解決方法,我可以嘗試通用,足以解決問題但不破壞其他情況?目前我正在使用的工作是在每個空格之後插入一個0x200E0x200F,這個空格基於字符串中前一個強指示字符的方向,但我不確定是否存在會導致問題的某些字符串。

更新:我能重現此問題在Ubuntu 12.04用gedit(與啓用文字環繞不要超過兩行啓用設置不拆分的話)。我一遍又一遍地輸入Hello world,直到它被多次包裹,然後用पहुंचगया替換world的所有實例,並且所有東西都摺疊成一行。

+0

這個問題在pango裏面有一個單詞RTL後的LTR單詞(或者反過來)作爲一個單詞,所以如果你選擇在單詞上換行,它不會在兩個單詞上打破它。 –

+0

我更新了問題,提到當我只交替使用LTR腳本時(例如英語和印地語),問題也會發生 – pauld

回答

6

符號U+200FU+200E是右向左和左向右標記。 S:

  • 每個英文文本和阿拉伯文字之間,把右至左符號
  • 每個阿拉伯文字和英文文本之間,把左至右符號

它是一個錯誤,因爲Pango應該自動查看文本,但是因爲Pango沒有這樣做,所以應該手動執行。

+0

謝謝。我試圖弄清楚這是否是pango中的錯誤,或者是否需要這些符號。如果我將相同的文本放在Microsoft Word文本框或Qt文本編輯框中,那麼結果就是我所期望的(看起來像底部的圖片)。 – pauld

5

在我看來一個錯誤或不完整的功能,因爲它出現在混合腳本。

對我來說,您使用的是舊式的pango開發,可能來自Ubuntu 12.04?

Ubuntu 12.04 contains Gedit 3.4 
Ubuntu 15.10 contains Gedit 3.10 

Pango在3.6版本中發生了根本性的變化,它已經用HarfBuzz取代了他的成型引擎。 [2]

我無法使用Gedit 15.10重現該錯誤,它總是將(2)兩個單詞向下移動,也不允許我調整窗口大小以嘗試分割這兩個單詞。見屏幕截圖。

pango shaping mixed scripts in gedit

更新:

看來其行爲已經改變:

  • 它不會從英文劇本包住第一個字時開始用阿拉伯語。

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

    enter image description here

  • 它同以前的情況下,不換行,並執行寬度

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

    enter image description here

參考文獻:

+2

感謝您的幫助。在你發佈後,我已經在ubuntu 15.1的gedit中嘗試了這一點,並且我得到了相同的結果(使用上面提到的hello world測試用例)。 – pauld

+0

我也不確定哪個版本的pango ubuntu 15.1正在使用。從'/ usr/lib'搜索pango,我看到的唯一的pango庫是'libpango-1.0.so.0'(和其他一些版本相似的) – pauld

+1

@pauld,好的我可以重現它,我沒有注意到'--wrap = word',因爲你的問題很清楚'word-char'包裝模式。在Ubuntu 15.10中有相同的行爲。所以這個答案與我將在稍後刪除的問題無關。我應該添加它不僅僅是'U + 200F'和U + 200E',但是任何控制字符都會使英文單詞換行。到目前爲止,我已經測試了'U + 202C','U + 061C','U + 202A','U + 2069',並且在交換英文單詞1st和阿拉伯語2nd時發生同樣的事情。 –

0

注意,我們最近升級我們用攀高的版本,從攀高版本1.36.1至1.38.1,這個問題就走了。所以我認爲這是一個已經修復的pango或harfbuzz中的bug。