如果我将Unicode规范化表格C应用于字符串,字符串中的代码点数量是否会增加?
答案 0 :(得分:7)
是的,在应用NFC规范化后,有些代码点会扩展到多个代码点。例如,在Basic Multilingual Plane内,有70个代码点在应用NFC归一化后扩展到2个代码点,并且在Alphabetic Presentation Forms block内有2个代码点(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
来安装模块。 )
示例:
打印扩展到3个代码点的BMP中的代码点:
unichars 'length(NFC) == 3'
שּׁ U+FB2C HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT שּׂ U+FB2D HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
计算扩展到多个代码点的所有平面中的代码点数:
unichars -a 'length(NFC) > 1' | wc -l
85
另请参阅常见问题What are the maximum expansion factors for the different normalization forms?