如果我将 Unicode 规范化表格 C 应用于字符串,字符串中的代码点数量会增加吗?
1 回答
是的,在应用 NFC 标准化后,有些代码点会扩展为多个代码点。例如,在Basic Multilingual Plane中,有 70 个码点在应用 NFC 规范化后扩展为 2 个码点,并且有 2 个码点(字母表示形式块内的 U+FB2C 和 U+FB2D )扩展为 3 个码点。
对这个所谓的“扩展因子”的一个保证是,在应用 NFC 标准化后,任何字符串的长度(就代码单元数而言)都不会扩展超过 3 倍:
还有一个 Unicode Consortium 稳定性策略,规范映射在所有版本的 Unicode 中始终受到限制,因此使用 NFC 分解时没有字符串扩展超过 3 倍的长度(以代码单元测量)。无论文本是 UTF-8、UTF-16 还是 UTF-32,都是如此。此保证还允许在处理中进行某些优化,尤其是在确定缓冲区大小时。
第 9 节,检测规范化形式。UAX #15:Unicode 规范化形式。
我编写了一个 Java 程序来确定 Unicode 块中的哪些代码点扩展到多个代码点:http: //ideone.com/9PUOCb
或者,可以使用Tom Christiansen的unichars
实用程序,它是 Unicode::Tussle CPAN 模块的一部分。(注意:Mac 用户可能会在make test
安装步骤看到错误,提示 Perl 版本太旧。如果看到此错误,您可以通过notest install Unicode::Tussle
在 CPAN shell 中运行来安装模块。)
例子:
打印 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
另请参阅常见问题不同归一化形式的最大扩展因子是什么?