Как заставить арабских персонажей разделяться? - PullRequest
2 голосов
/ 28 марта 2019

Я пытаюсь набрать набор арабских символов без пробела на изображении, используя подушку. Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что некоторые арабские символы, когда они находятся рядом друг с другом, выглядят по-разному, когда они разделены. ((Например, س и ‍ ل будут ‍ سل, если их поместить рядом друг с другом. ) Я пытаюсь каким-то образом заставить мои настройки шрифта всегда разделять все символы без введения каких-либо других символов, что мне делать?

Вот фрагмент моего кода:

#font is an arabic font, and font_path is pointing to that location.
        font = ImageFont.truetype(
            font=font_path, size=size,
            layout_engine=ImageFont.LAYOUT_RAQM)

        h, w = font.getsize(text, direction='rtl')
        offset = font.getoffset(text)
        H, W = int(1.5 * h), int(1.5 * w)
        imgSize = H, W
        img = Image.new(mode='1', size=imgSize, color=0)
        draw = ImageDraw.Draw(img)
        pos = ((H-h)/2, (W-w)/2)
        draw.text(pos, text, fill=255, font=font,
                  direction='rtl', align='center')

1 Ответ

2 голосов
/ 28 марта 2019

То, что вы описываете , возможно возможно с некоторыми шрифтами, которые поддерживают арабский, в частности, теми, которые кодируют чувствительные к положению формы в арабских формах представления-B Блок Юникода.Вам необходимо отобразить введенные текстовые коды символов в правильный позиционный вариант.Так что для примеров символов видимых и lam , как вы описали, U + 0633 س‎ и U + 0644 ل‎, вам нужна начальная форма U + 0633, которая являетсяU + FEB3 ﺳ‎‎ и окончательная форма U + 0644, то есть U + FEDE , складывающая их вместе (разделенные обычным пробелом): ﺳ‌ ﻞ‌.

Есть полезныйдиаграмма, показывающая позиционные формы на https://en.wikipedia.org/wiki/Arabic_script_in_Unicode#Contextual_forms.

Но, важно для понимания:

  • не все шрифты, содержащие арабский язык, имеют закодированные формы представления(многие шрифты этого не делают)

  • не все арабские коды имеют эквивалент в диапазоне форм представления (большинство базовых кодов имеют, но есть некоторые расширенные арабские символы для других языков, которые делаютне имеют форм представления).

  • вы несете ответственность за обработку вашего входного текста (в диапазоне U + 06xx) в правильные коды формы представления (диапазон U + FExx), основанные на слове/ групповой контекст, который может быть сложным.Эта работа обычно относится к движку OpenType Layout, но он также выполняет соединение.Таким образом, вы в основном отвергаете эту логику.

...