Unicode中阿拉伯字母的结构

The structure of Arabic letters in Unicode

我在维基百科上找到了两个不同的 "versions" 阿拉伯字母。 first example 似乎是 3 个子组件合二为一:

"ـمـ".split('').map(x => x.codePointAt(0).toString(16))
[ '640', '645', '640' ]

this page 上找到这个 "m medial" 字母给了我这个:

ﻤ
fee4

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

阿拉伯文是草书连接的脚本;字母的形状会根据它们是出现在单词的开头、中间还是结尾而变化。有时您可能希望单独显示这些上下文形式,例如简单地显示它们的外观。

解决此问题的推荐方法是对要连接的字母使用特殊的引起连接的字符。其中之一是 tatweel(也称为 kashida),它本质上是一条两端带有“胶水”的短线段。因此,如果您用 tatweel 字符将字母 м 包围起来,文本渲染器会自动选择它的中间形式,就好像它出现在单词的中间一样 (ـمـ)。 م 的底层字符代码没有改变,只有它的可见字形。

但是,由于历史原因,Unicode 还包含大量所谓的阿拉伯语表示形式。它们代表那些相同的上下文字母形状,但作为独立的字符代码,不会根据周围环境而改变;将 m 的“孤立”表示形式放在两个 tatweel 之间并不影响它的外观,例如:ـﻡـ

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