Pango中混合脚本的自动换行

13

我有一个使用pango的文本框实现。如果我输入一个以从右到左书写的单词开头,后跟一个空格,再后跟一个从左到右书写的单词的字符串,那么pango使用的单词换行就会出错(使用PANGO_WRAP_WORD_CHAR)。对于字符串العربية ENGLISH,我得到以下结果:

Bad word wrapping

如果我在空格后面添加Unicode字符U+200F,那么我就会得到期望的换行效果。

Expected word wrapping

此外,如果我用印地语(从左到右,就像旁边的英语)替换上面的阿拉伯文,则仍然会出现问题,因此它似乎不是严格的从左到右或从右到左的问题。 在印地语情况下,我插入了一个hack,在空格后插入0x200E以解决该问题。
这是pango的一个错误吗? 有没有通用的解决方法可以尝试修复问题而不破坏其他情况? 我正在使用的当前解决方法根据字符串中前一个强制定向字符的方向,在每个空格之后插入0x200E0x200F,但我不确定是否会对某些字符串造成问题。
更新:我能够在启用了gedit(启用了启用文本换行不将单词分成两行设置)的Ubuntu 12.04上重现此问题。 我只需反复输入Hello world直到它折叠几次,然后将所有world实例替换为पहुंचगया,然后所有内容都折叠到一行。

Pango存在一个问题,即在RTL单词之后(或相反)的LTR单词被视为一个单词,因此如果选择按单词换行,则不会将其分成两个单词。 - Assem
我更新了问题,提到当我只有LTR脚本交替时(例如英语和印地语),问题也会发生。 - default
3个回答

5
这段文字的意思是:“符号U+200FU+200E是从右到左和从左到右标记。在每个英文文本和阿拉伯文本之间,放一个从右到左的标记,在每个阿拉伯文本和英文文本之间,放一个从左到右的标记。这是一个错误,因为Pango应该在查看文本时自动执行此操作,但由于Pango没有执行,您需要手动执行它。”

谢谢。我正在尝试弄清楚这是否是Pango中的一个错误,或者这些符号是必需的。如果我将相同的文本放入Microsoft Word文本框或Qt文本编辑框中,则结果与我期望的相同(看起来像底部图片)。 - default

4

在混合脚本中,它对我来说似乎是一个错误或不完整的功能。

看起来您正在使用旧的 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

更新:

看起来它的行为已经改变了:

  • It does not wrap the 1st word from English script when start with Arabic.

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

    enter image description here

  • It same as previous case, does not wrap, and enforce the width

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

    enter image description here

参考文献:


2
感谢您的帮助。在您的帖子之后,我尝试在Ubuntu 15.1的gedit中运行此代码,并获得了相同的结果(使用我上面提到的hello world测试用例)。 - default
我也不确定Ubuntu 15.1使用的Pango版本是什么。从/usr/lib搜索Pango,我只看到了libpango-1.0.so.0(以及一些类似版本的其他库)。 - default
1
@pauld,好的,我可以重现它,我没有注意到--wrap=word,因为你的问题明确提到了word-char换行模式。在Ubuntu 15.10中也有相同的行为。所以这个答案与问题无关,我稍后会删除它。我应该补充说明,不仅是U+200FU+200E,任何控制字符都会使英文单词换行。到目前为止,我测试过U+202CU+061CU+202AU+2069,当先换英文单词再换阿拉伯语时,同样的事情会发生。 - user.dz
1
@Sneetsher,我认为你的回答很相关,因为它展示了如何重现这种行为。 - Assem

2

注意,我们最近升级了使用的pango版本,从1.36.1版本升级到1.38.1版本,这个问题就解决了。因此,我认为这是pango或harfbuzz中已经修复的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接