为什么NFKC的所有数字都标准化不起作用?

时间:2019-03-08 00:39:12

标签: javascript regex unicode locale normalize

JavaScript中,我通过NFKC使用String.prototype.normalize规范化将全角规范为标准ASCII半角字符。

'1'.normalize('NFKC') === '1'
> true

但是,看着像૫ which is the digit 5 in Gujarati这样的更晦涩的数字并不能归一化。

'૫'.normalize('NFKC') === '5'
> false

我想念什么?

2 个答案:

答案 0 :(得分:1)

Unicode规范化是针对彼此不同的字符,而不是针对可能具有相似含义的每组字符。

字符“ 1”(全数字一号)本质上只是字符“ 1”(数字一号),其样式略有不同,如果不需要兼容性,则无需进行编码。在某些情况下,它们是完全可互换的,因此将前者分配给后者的分解映射。字符“ ૫”(GUJARATI DIGIT FIVE)没有分解映射,因为它不是任何其他字符的变体;这是它自己独特的东西。

您可以查询Unicode字符数据库,以查看哪些字符分解,哪些字符(即大多数)不分解。例如,指向作为问题一部分发布的工具的链接向您显示shows在任何形式的Unicode规范化下都不会改变。

答案 1 :(得分:0)

您在这里使用的 NFKC 代表 Compatibility Decomposition,然后是 Canonical Composition,在普通英语中,这意味着首先将事物分解为更小的更常用的符号,然后将它们组合起来以找到等效的更简单的字符。例如?->0,fi->fi(代码点fi=64257)。 它不会转换为 ASCII,例如在 ख़(2393)-> ख़([2326, 2364])

参考:https://unicode.org/reports/tr15/#Norm_Forms 为了更简单的理解:https://towardsdatascience.com/difference-between-nfd-nfc-nfkd-and-nfkc-explained-with-python-code-e2631f96ae6c