首页 > 解决方案 > 在 Unicode 中,U+0651 ARABIC SHADDA 应该在 KASRA 之前还是之后...?

问题描述

用阿拉伯语取这个词:مرَّة

这可以用以下 Unicode 字符序列编写:

/*
U+0645 # ARABIC LETTER MEEM
U+0631 # ARABIC LETTER REH
U+0651 # ARABIC SHADDA
U+064e # ARABIC FATHA
U+0629 # ARABIC LETTER TEH MARBUTA
*/
console.log("\u0645\u0631\u0651\u064e\u0629")

或者作为这个序列(相同的字母,但是交换了 FATHA 和 SHADDA 的顺序):

/*
U+0645 # ARABIC LETTER MEEM
U+0631 # ARABIC LETTER REH
U+064e # ARABIC FATHA
U+0651 # ARABIC SHADDA
U+0629 # ARABIC LETTER TEH MARBUTA
*/
console.log("\u0645\u0631\u064e\u0651\u0629")

它们都呈现相同的。他们都被认为是正确的吗?一个被认为比另一个更可取吗?

标签: unicodearabic

解决方案


我不确定一个是否被认为是正确的。然而,有趣的是,标准化 Unicode 总是导致 shadda 排在第二位,因为标准化形式有 NFC、NFKC、NFD、NFKD。

看看这个 Python 代码:

>>> shadda_first  = "\u0645\u0631\u0651\u064e\u0629"
>>> shadda_second = "\u0645\u0631\u064e\u0651\u0629"
>>> shadda_second == shadda_first
False
>>> shadda_first
'مرَّة'
>>> shadda_second
'مرَّة'
>>> import unicodedata
>>> unicodedata.normalize("NFC", shadda_second)
'مرَّة'
>>> unicodedata.normalize("NFC", shadda_second) == shadda_second
True
>>> unicodedata.normalize("NFC", shadda_first) == shadda_second
True
>>> unicodedata.normalize("NFKC", shadda_second) == shadda_second
True
>>> unicodedata.normalize("NFKC", shadda_first) == shadda_second
True
>>> unicodedata.normalize("NFD", shadda_second) == shadda_second
True
>>> unicodedata.normalize("NFD", shadda_first) == shadda_second
True
>>> unicodedata.normalize("NFKD", shadda_second) == shadda_second
True
>>> unicodedata.normalize("NFKD", shadda_first) == shadda_second
True

(请注意,Stack Overflow 使得在等宽输出中很难看到 KASRA 变音符号。将答案复制并粘贴到您最喜欢的文本编辑器中,以查看 مرَّة 中的变音符号。)


推荐阅读