什么是标准化的UTF-8?
在ICU项目(也现在有一个PHP库)中包含有需要帮助恢复正常UTF-8串类,使搜索时更容易地比较值。
但是,我试图弄清楚这对应用程序意味着什么。例如,在哪种情况下,我想要“规范对等”而不是“兼容性对等”,反之亦然?
回答:
关于Unicode标准化的所有您想知道的内容
回答:
Unicode包括多种编码某些字符(最著名的是重音字符)的方法。规范化规范将代码点更改为规范编码形式。生成的代码点应与原始代码点相同,除非字体或渲染引擎中有任何错误。
何时使用
因为结果看起来相同,所以在存储或显示字符串之前对字符串进行规范化的标准化始终是安全的,只要您可以容忍结果与输入不尽相同即可。
规范化归纳有两种形式:NFD和NFC。从一个人可以在这两种形式之间进行转换而不会造成损失的意义上来说,两者是等效的。在NFC下比较两个字符串将始终得到与在NFD下比较两个字符串相同的结果。
无损检测
NFD的字符已完全扩展。这是计算速度更快的规范化形式,但是会导致更多的代码点(即,使用更多的空间)。
如果只想比较尚未标准化的两个字符串,这是首选的标准化形式,除非您知道需要兼容性标准化。
NFC
运行NFD算法后,NFC会在可能的情况下重组代码点。这会花费更长的时间,但会导致字符串更短。
回答:
Unicode还包括许多实际上不属于但在旧式字符集中使用的字符。Unicode添加了这些功能,以允许将这些字符集中的文本作为Unicode处理,然后无损地转换回去。
兼容性归一化将这些转换为相应的“真实”字符序列,并执行规范化归一化。兼容性归一化的结果可能与原始结果不一样。
包含格式信息的字符将被不包含格式信息的字符替换。例如,字符⁹
被转换为9
。其他不涉及格式差异。例如,罗马数字字符Ⅸ
转换为常规字母IX
。
显然,一旦执行了此转换,就不再可能无损地转换回原始字符集。
何时使用
Unicode联合会建议将兼容性规范化视为一种ToUpperCase
转换。这在某些情况下可能有用,但您不应该随便使用它。
一个很好的用例是搜索引擎,因为您可能希望搜索9
匹配⁹
。
您可能不应该做的一件事是显示对用户应用兼容性标准化的结果。
NFKC / NFKD
兼容性规范化形式有两种形式:NFKD和NFKC。它们与NFD和C之间的关系相同。
NFKC中的任何字符串本质上也在NFC中,对于NFKD和NFD也是相同的。因此NFKD(x)=NFD(NFKC(x))
,和NFKC(x)=NFC(NFKD(x))
等。
回答:
如有疑问,请进行规范化归一化处理。根据适用的空间/速度权衡,或根据互操作对象的要求选择NFC或NFD。
以上是 什么是标准化的UTF-8? 的全部内容, 来源链接: utcz.com/qa/426332.html