unicode - 在 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")
它们都呈现相同的。他们都被认为是正确的吗?一个被认为比另一个更可取吗?
解决方案
我不确定一个是否被认为是正确的。然而,有趣的是,标准化 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 变音符号。将答案复制并粘贴到您最喜欢的文本编辑器中,以查看 مرَّة 中的变音符号。)
推荐阅读
- c++ - 将 char[] 数组转换为字节,然后将字节转换为 int,反之亦然
- javascript - 无论如何要更改错误代码“TypeError:a未定义”?
- nginx - Nginx 405 方法不允许,即使是 JSON 响应
- c++ - 我需要做一个深拷贝,我是否正确使用了我的复制构造函数?
- c++ - 如何在 C++11 的内存池中分配 std::map 的内部 RB_tree 节点?
- android - 在 onCreate 开始时使用 setText 无法更改我的 textView 的文本
- javascript - 根据变量的长度多次进行突变调用
- google-cloud-platform - Google Cloud 分层计费 - 项目 v 计费帐户
- python - 在 numpy 数组中查找最近的值
- jenkins - 如何在我的代码中引用 jenkinsfile 声明性工具参考