Unicode中阿拉伯字母的结构

Lan*_*ard 1 string unicode encoding arabic internationalization

我在维基百科上找到了两个不同的阿拉伯字母“版本”。第一个示例似乎将 3 个子组件合二为一:

\n\n
"\xd9\x80\xd9\x85\xd9\x80".split(\'\').map(x => x.codePointAt(0).toString(16))\n[ \'640\', \'645\', \'640\' ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

在本页找到这个“m medial”字母给我这个:

\n\n
\xef\xbb\xa4\nfee4\n
Run Code Online (Sandbox Code Playgroud)\n\n

代码点 640 和 645 是“阿拉伯语 tatwheel”\xd9\x80和“阿拉伯语字母 meem” \xd9\x85。有没有搞错?这是如何运作的?到目前为止,我在 Unicode 阿拉伯语的信息中没有看到这些字形是如何“组成”的。为什么是由这些部分组成的呢?所有字形的结构是否都有一个模式?(维基百科第一个页面上的所有字形都很相似,但第二个页面上的所有字形都是一个代码点)。在哪里可以找到有关如何有效解析阿拉伯语(或任何其他语言)字符的信息?

\n

Cha*_*uff 5

阿拉伯语是一种带有草书连接的文字;字母的形状根据它们是否出现在单词的开头、中间或最后而变化。有时您可能希望单独显示这些上下文表单,例如简单地显示它们的外观。

\n\n

建议的方法是使用特殊的连接字符来连接字母。其中之一是 tatweel(也称为kashida)),它本质上是一条两端都有 \xe2\x80\x9cglue\xe2\x80\x9d 的短线段。因此,如果您在字母 \xd9\x85 两侧都添加纹身字符,则文本渲染器会自动选择其中间形式,就好像它出现在单词的中间一样 (\xd9\x80\xd9\x85\xd9\x80) 。\xd9\x85 的底层字符代码不会\xe2\x80\x99 发生变化,只有其可见的字形发生变化。

\n\n

然而,由于历史原因,Unicode 还包含大量所谓的阿拉伯语表示形式。它们代表相同的上下文字母形状,但作为单独的字符代码,不会根据周围环境而改变;将 \xe2\x80\x9cisolated\xe2\x80\x9d 表示形式 \xd9\x85 放在两个纹身之间不会影响其外观,例如: \xd9\x80\xef\xbb\xa1\xd9\x80

\n\n

不建议使用这些演示形式来实际书写阿拉伯语。它们的存在只是为了与旧的遗留编码兼容,并且不需要\xe2\x80\x99来正确排版阿拉伯文本。我认为维基百科只是将它们用于演示目的并展示它们的存在。如果遇到表示形式,通常可以对字符串应用 Unicode 规范化(NFKD 或 NFKC)来获取底层基本字母。有关详细信息,请参阅有关演示文稿的 Unicode 常见问题解答。

\n