ICU project(现在也有PHP library)包含帮助规范化UTF-8字符串以使搜索时更容易比较值所需的类.
然而,我试图找出what this means个应用程序.例如,在哪些情况下,我希望"规范等价"而不是"兼容性等价",或者反之亦然?
ICU project(现在也有PHP library)包含帮助规范化UTF-8字符串以使搜索时更容易比较值所需的类.
然而,我试图找出what this means个应用程序.例如,在哪些情况下,我希望"规范等价"而不是"兼容性等价",或者反之亦然?
Unicode包括多种编码某些字符的方法,最显著的是重音字符.规范化将代码点更改为规范化编码形式.除非字体或渲染引擎中存在任何错误,否则生成的代码点应该与原始代码点相同.
因为结果看起来是相同的,所以在存储或显示字符串之前对其应用规范化总是安全的,只要您能够容忍结果与输入不完全相同.
规范规范化有两种形式:NFD和NFC.这两种形式在某种意义上是等价的,即人们可以在这两种形式之间无损失地转换.在NFC下比较两个字符串始终会得到与在NFD下比较相同的结果.
NFD已将角色完全展开.这是计算速度更快的规范化形式,但结果会产生更多代码点(即使用更多空间).
如果您只想比较两个尚未规范化的字符串,这是首选的规范化形式,除非您知道需要兼容性规范化.
NFC在运行NFD算法后尽可能重新组合代码点.这需要更长的时间,但会导致更短的字符串.
Unicode还包括许多实际上不属于的字符,但这些字符是在旧字符集中使用的.Unicode添加这些是为了允许将这些字符集中的文本作为Unicode处理,然后毫无损失地转换回来.
兼容性规范化将这些字符转换为相应的"实"字符序列,并执行规范规范化.兼容性规范化的结果可能与原始结果不一致.
包含格式信息的字符将替换为不包含格式信息的字符.例如,字符⁹
被转换为9
.另一些则不涉及格式差异.例如,罗马数字字符Ⅸ
被转换为普通字母IX
.
显然,一旦执行了此转换,就不可能再无损地转换回原始字符集.
Unicode联盟建议将兼容性规范化考虑为ToUpperCase
转换.在某些情况下,它可能是有用的,但你不应该只是随意地应用它.
一个很好的用例是搜索引擎,因为你可能希望搜索9
来匹配⁹
.
您可能不应该做的一件事是显示对用户应用兼容性规范化的结果.
Compatibility normalization form comes in two forms NFKD and NFKC. They have the same relationship as between NFD and C.
NFKC中的任何字符串本质上也是NFC中的字符串,NFKD和NFD也是如此.因此,NFKD(x)=NFD(NFKC(x))
和NFKC(x)=NFC(NFKD(x))
等等.
如果有疑问,请使用规范化.根据适用的空间/速度权衡,或根据与您交互操作的对象的要求, Select NFC或NFD.