Перенос слов в pango со смешанными скриптами

У меня есть текстовое поле, использующее pango. Если я помещаю строку, которая начинается со слова справа налево script, за которым следует пробел, за которым следует слово в левом-правом значении script, слово wrapping, которое использует pango, запутывается (используя PANGO_WRAP_WORD_CHAR). Для строки العربية ENGLISH Я получаю следующее:

Плохая упаковка слов

Если после пробела добавить символ unicode U+200F, тогда я получаю ожидаемую перенос слов:

Ожидаемая упаковка слов

Кроме того, если я заменил арабский script выше на хинди (который слева направо, как и английский рядом с ним), я все равно получаю проблему, поэтому она не выглядит строго левым, справа, справа налево. В случае хинди я вложил взломанный текст, который вставляет 0x200E после пробела, который разрешает проблему.

Это ошибка в pango? Есть ли какие-то проблемы, которые я могу попробовать, которые достаточно общие для решения проблемы, но не нарушают другие случаи? Текущая работа вокруг я использую вставки либо 0x200E, либо 0x200F после каждого пробела, основанного на направлении предыдущего строго направленного символа в строке, но я не уверен, есть ли там определенные строки, что это вызовет проблемы с.

Обновление: я смог воспроизвести эту проблему на Ubuntu 12.04 с помощью gedit (с помощью Enable Text Wrapping и Do not split words over two lines settings enabled). Я просто набирал Hello world снова и снова, пока он не обернул несколько раз, а затем заменил все экземпляры world на पहुंचगया, и все свернулось в одну строку.

Ответ 1

Символы U+200F и U+200E имеют значения RIGHT-TO-LEFT и LEFT-TO-RIGHT. S:

  • между каждым английским текстом и арабским текстом, поставьте знак "ВПРАВО-ВЛЕВО"
  • между каждым арабским текстом и текстом на английском языке, поставьте метку LEFT-TO-RIGHT

Это ошибка, потому что Pango должен автоматически записывать текст, но поскольку Pango не делает этого, вы должны сделать это вручную.

Ответ 2

Мне кажется, ошибка или не полная функция, как она появляется на смешанных скриптах.

Похоже, вы используете старое развитие панго, возможно, от 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 формирование смешанных скриптов в gedit

Update:

Похоже, его поведение изменилось:

  • Он не завершает первое слово с английского script, когда начинается с арабского.

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

    введите описание изображения здесь

  • То же, что и в предыдущем случае, не обертывает и не применяет ширину

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

    введите описание изображения здесь

Литература:

Ответ 3

Обратите внимание, что мы недавно обновили версию используемого нами pango, от версии pango 1.36.1 до 1.38.1, и эта проблема исчезла. Поэтому я считаю, что это была ошибка в pango или harfbuzz, которая с тех пор была исправлена.