【发布时间】:2013-07-27 16:17:11
【问题描述】:
如果我将 Unicode 规范化表单 C 应用于字符串,字符串中的代码点数会增加吗?
【问题讨论】:
标签: unicode normalization utf unicode-normalization
如果我将 Unicode 规范化表单 C 应用于字符串,字符串中的代码点数会增加吗?
【问题讨论】:
标签: unicode normalization utf unicode-normalization
是的,应用 NFC 规范化后,有些代码点会扩展为多个代码点。例如,Basic Multilingual Plane 内有 70 个码点在应用 NFC 归一化后扩展为 2 个码点,并且有 2 个码点(Alphabetic Presentation Forms block 内的 U+FB2C 和 U+FB2D)扩展为 3 个码点。
您对这个所谓的“扩展因子”的一个保证是,在应用 NFC 标准化后,任何字符串的长度都不会扩展超过 3 倍(以code units 的数量计):
还有一个 Unicode Consortium 稳定性策略,规范映射始终在所有版本的 Unicode 中受到限制,因此在使用 NFC 分解时,没有任何字符串会扩展超过 3 倍的长度(以代码单位衡量)。无论文本是 UTF-8、UTF-16 还是 UTF-32,都是如此。此保证还允许在处理中进行某些优化,尤其是在确定缓冲区大小时。
第 9 节,Detecting Normalization Forms。 UAX #15:Unicode 规范化形式。
我编写了一个 Java 程序来确定 Unicode 块中的哪些代码点扩展为多个代码点:http://ideone.com/9PUOCb
或者,可以使用Tom Christiansen 的unichars 实用程序,它是Unicode::Tussle CPAN 模块的一部分。 (注意:Mac 用户可能会在 make test 安装步骤看到错误,提示 Perl 版本太旧。如果看到此错误,可以通过在 CPAN shell 中运行 notest install Unicode::Tussle 来安装模块。)
例子:
打印 BMP 中扩展为 3 个代码点的代码点:
unichars '长度(NFC) == 3'
שּׁ U+FB2C HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT שּׂ U+FB2D HEBREW LETTER SHIN WITH DAGESH 和 SIN DOT
计算所有平面中扩展为多个代码点的代码点数:
unichars -a '长度(NFC)> 1' | wc -l
85
另见常见问题What are the maximum expansion factors for the different normalization forms?
【讨论】:
unichars 'length(NFC) > 1' | wc -l 是 BMP 的 72,添加 -a 以包含所有平面会产生 85。
unichars 看起来像一个简洁的工具。我必须安装它并试一试:)