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

问题描述 投票:1回答:2

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

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

然而,看看更加模糊的数字,如5 which is the digit 5 in Gujarati,它没有正常化。

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

我错过了什么?

javascript regex unicode locale normalize
2个回答
1
投票

Unicode规范化适用于彼此变体的字符,而不适用于可能具有相似含义的每组字符。

字符'1'(FULLWIDTH DIGIT ONE)基本上只是字符'1'(DIGIT ONE),具有略微不同的样式,如果不是兼容性则不会编码。它们 - 在某些情况下 - 完全可以互换,因此前者被分配了映射到后者。字符'5'(GUJARATI DIGIT FIVE)没有分解映射,因为它不是任何其他字符的变体;这是它自己独特的事情。

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


1
投票

你看错了问题。

Unicode的主要目的是编码字符(不丢失信息)。字体和其他程序应该能够解释这些字符并给出一个字形(根据组合代码点,附近的字符和代码点之外的其他特征[如语言,纪元,字体特征[脚本和非脚本,大写,斜体等]更改如何组合字符和连字(以及字形形式)。

有两个主要的规范化(规范和兼容)[和两个变体:分解,并在可能时组合]。规范标准化删除不需要的字符(重复)并以标准方式排序组成字符。兼容规范化删除“兼容字符”:Unicode中的字符只是为了不丢失有关转换到其他字符集的信息。

一些数字(如小2指数)具有兼容字符作为普通数字(这是一个格式化问题,unicode不是关于格式化)。但在其他情况下,不同字符中的数字应保持不同的字符。

那是关于正常化的。

但是你想得到一个unicode字符的数值(警告:它可能取决于其他字符,位置等)。

Unicode数据库也提供了这样的属性。

使用Javascript,您可以使用unicode-properties javasript package,它还为您提供getNumericValue(codePoint)功能。这个包似乎使用了高效的数据库压缩,但所以我不知道它有多快。数据库很庞大。

© www.soinside.com 2019 - 2024. All rights reserved.