ICU project(现在也有PHP library)包含帮助规范化UTF-8字符串以使搜索时更容易比较值所需的类.

然而,我试图找出what this means个应用程序.例如,在哪些情况下,我希望"规范等价"而不是"兼容性等价",或者反之亦然?

推荐答案

Everything You Never Wanted to Know about Unicode Normalization

规范正规化

Unicode包括多种编码某些字符的方法,最显著的是重音字符.规范化将代码点更改为规范化编码形式.除非字体或渲染引擎中存在任何错误,否则生成的代码点应该与原始代码点相同.

何时使用

因为结果看起来是相同的,所以在存储或显示字符串之前对其应用规范化总是安全的,只要您能够容忍结果与输入不完全相同.

规范规范化有两种形式:NFD和NFC.这两种形式在某种意义上是等价的,即人们可以在这两种形式之间无损失地转换.在NFC下比较两个字符串始终会得到与在NFD下比较相同的结果.

NFD

NFD已将角色完全展开.这是计算速度更快的规范化形式,但结果会产生更多代码点(即使用更多空间).

如果您只想比较两个尚未规范化的字符串,这是首选的规范化形式,除非您知道需要兼容性规范化.

NFC

NFC在运行NFD算法后尽可能重新组合代码点.这需要更长的时间,但会导致更短的字符串.

兼容性归一化

Unicode还包括许多实际上不属于的字符,但这些字符是在旧字符集中使用的.Unicode添加这些是为了允许将这些字符集中的文本作为Unicode处理,然后毫无损失地转换回来.

兼容性规范化将这些字符转换为相应的"实"字符序列,并执行规范规范化.兼容性规范化的结果可能与原始结果不一致.

包含格式信息的字符将替换为不包含格式信息的字符.例如,字符被转换为9.另一些则不涉及格式差异.例如,罗马数字字符被转换为普通字母IX.

显然,一旦执行了此转换,就不可能再无损地转换回原始字符集.

何时使用

Unicode联盟建议将兼容性规范化考虑为ToUpperCase转换.在某些情况下,它可能是有用的,但你不应该只是随意地应用它.

一个很好的用例是搜索引擎,因为你可能希望搜索9来匹配.

您可能不应该做的一件事是显示对用户应用兼容性规范化的结果.

NFKC/NFKD

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.

Php相关问答推荐

基于产品变化自定义字段自定义WooCommerce低库存邮箱内容

PHP -使用preg_match在字符串中进行匹配

显示WooCommerce当前产品类别或标签的短代码

如何在不指定symfony列的情况下从数据库中获取行数组

PHP中冒号的奇怪用例

如何在Foreach语句中使用php和li按降序排序?

中继器内置中继器的ACF WordPress组

Chillerlan/php-iOS名称字段的QR vCard错误

创建一个Woocommerce我的帐户订单页面,仅显示已完成的订单

curl_close()未从PHP 8开始写入CURLOPT_COOKIEJAR会话文件

打折时更改 Woocommerce 产品名称

如何将不同的 Woocommerce 费用合并为一个名称?

PHP Laravel 迁移文件不创建关系

向元素添加类时添加循环错误

根据页面的最后修订日期设置 MediaWiki 内部链接的样式

避免在 WooCommerce 中多次触发挂钩函数

Woocommerce的数量和价格条件

带有 nginx 的 Symfony 不提供 .js 和 .css 文件

Laravel Docker 几个数据库

WooCommerce 按 ID 限制产品