我正在尝试使用枕头在图像上键入一组没有空格的阿拉伯字符。我目前遇到的问题是,一些阿拉伯字符在彼此相邻时,在分开时显示不同。((例如
س
和 u200dل
当彼此相邻时将是 u200dسل
。 )我试图以某种方式强制我的字体设置始终分隔所有字符而不注入任何其他字符,我应该做什么?
这是我的代码片段:
#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')
您所描述的可能可以使用支持阿拉伯语的一些字体实现,特别是那些在Unicode的阿拉伯语表示形式-B块中对位置敏感形式进行编码的字体。您需要将输入文本字符代码映射到正确的位置变体。因此,对于您所描述的示例字符 seen 和 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 布局引擎负责,但它也执行连接。所以你基本上推翻了这个逻辑。