Перенос слов в панго со смешанными сценариями

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

Неверный перенос слов

Если я добавлю символ Юникода U+200F после пробела, я получу ожидаемый перенос слов:

Ожидаемый перенос слов

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

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

Обновление: мне удалось воспроизвести эту проблему в Ubuntu 12.04 с помощью gedit (с включенными параметрами Включить перенос текста и Не разбивать слова на две строки). Я просто набирал Hello world снова и снова, пока оно не перевернулось несколько раз, затем заменил все экземпляры world на पहुंचगया, и все рухнуло в одну строку.


person default    schedule 09.12.2015    source источник
comment
проблема заключается в том, что слово LTR после слова RTL (или наоборот) как одно слово, поэтому оно не разбивает его на два, если вы выберете перенос слов.   -  person bigOther    schedule 12.12.2015
comment
Я обновил вопрос, упомянув, что проблема также возникает, когда у меня чередуются только сценарии LTR (например, английский и хинди).   -  person default    schedule 14.12.2015


Ответы (3)


Символы U+200F и U+200E обозначают знаки СПРАВА-НА-ЛЕВО и СЛЕВА-НАПРАВО. С:

  • между каждым английским текстом и арабским текстом поставьте отметку СПРАВА НАЛЕВО
  • между каждым арабским текстом и английским текстом поставьте отметку СЛЕВА НАПРАВО

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

person bigOther    schedule 10.12.2015
comment
Спасибо. Я пытаюсь выяснить, является ли это ошибкой в ​​панго или эти символы необходимы. Если я помещу один и тот же текст в текстовое поле Microsoft Word или поле редактирования текста Qt, то результаты будут такими, как я ожидаю (похоже на нижнее изображение). - person default; 10.12.2015

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

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

Обновление:

Кажется, его поведение изменилось:

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

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

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

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

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

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

Ссылки:

person user.dz    schedule 18.12.2015
comment
Спасибо за помощь. После вашего сообщения я попробовал это в gedit Ubuntu 15.1 и получил тот же результат (используя тестовый пример hello world, о котором я упоминал выше). - person default; 18.12.2015
comment
Я также не уверен, какую версию pango ubuntu 15.1 использует. Ищу панго из /usr/lib, единственная библиотека панго, которую я вижу, это libpango-1.0.so.0 (и некоторые другие с похожей версией) - person default; 18.12.2015
comment
@pauld, хорошо, я мог воспроизвести это, я не заметил --wrap=word, так как ваш вопрос был ясен о режиме переноса word-char. Такое же поведение в Ubuntu 15.10. Так что этот ответ не имеет отношения к проблеме, я удалю его позже. Я должен добавить его не только с U+200F и U+200E, но и с любым управляющим символом для переноса английского слова. то, что я тестировал до сих пор U+202C, U+061C, U+202A, U+2069 , и то же самое происходит при замене английского слова 1-го, а затем арабского 2-го. - person user.dz; 18.12.2015
comment
@Sneetsher, я думаю, что ваш ответ актуален, поскольку он показывает, как воспроизвести поведение. - person bigOther; 21.12.2015

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

person default    schedule 03.06.2016