如何强制阿拉伯字符分开?

How to force arabic characters to be seperate?

我正在尝试使用 pillow 在图像上输入一组没有 space 的阿拉伯字符。我目前遇到的问题是,当一些阿拉伯字符彼此相邻时,它们分开时会出现不同。((例如 س 和 ‍ل 将是 ‍سل 时并排放置。)我试图以某种方式强制我的字体设置始终分隔所有字符而不注入任何其他字符,我应该怎么做?

这是我的代码片段:

#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')

您所描述的可能可以使用某些支持阿拉伯语的字体,特别是那些对位置敏感形式进行编码的字体在 Arabic Presentation Forms-B Unicode 块中。您需要将输入的文本字符代码映射到正确的位置变体中。因此,对于您描述的示例字符 seenlam,U+0633 س‎ 和 U+0644 ل‎,你想要 U+0633 的初始形式,即 U+FEB3 ﺳ‎‎,以及 U+0644 的最终形式,即 U+FEDE ,将它们放在一起(由常规 [ 分隔) =48=]): ﺳ‌ ﻞ‌.

https://en.wikipedia.org/wiki/Arabic_script_in_Unicode#Contextual_forms.

处有一个有用的图表显示位置形式

但是,重要理解:

  • 并非所有包含阿拉伯语的字体都编码了表示形式(许多字体没有)

  • 并非所有阿拉伯语代码在演示文稿范围内都有等效字符(大多数基本代码都有,但对于没有演示文稿的其他语言,有一些扩展的阿拉伯语字符)。

  • 您负责根据word/group上下文将您输入的文本(在U+06xx范围内)处理成正确的表示形式(U+FExx范围)代码,这可以是棘手的。该工作通常落在 OpenType 布局引擎上,但它也执行连接。所以你基本上覆盖了那个逻辑。