Перенос слов в 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, которая с тех пор была исправлена.