Unicode NFC规范化可以增加字符串的长度吗?
如果我对字符串应用Unicode规范化表单C,字符串中的代码点数量会增加吗?是的,在应用NFC规范化后,有些代码点会扩展到多个代码点。例如,在中,有70个代码点在应用NFC规范化后扩展为2个代码点,有2个代码点(中的U+FB2C和U+FB2D)扩展为3个代码点 对于这个所谓的“扩展因子”,您有一个保证,即在应用NFC规范化后,任何字符串的长度扩展都不会超过3倍(就数量而言): 还有一个Unicode联盟的稳定策略,即在所有Unicode版本中,规范映射始终受到限制,因此使用NFC分解时,字符串的长度不会超过3倍(以代码单位度量)。无论文本是UTF-8、UTF-16还是UTF-32,都是如此。这种保证还允许在处理中进行某些优化,特别是在确定缓冲区大小时 第9节。UAX#15:Unicode规范化表单 我编写了一个Java程序来确定Unicode块中的哪些代码点扩展为多个代码点: 或者,也可以使用Unicode::Tussle CPAN模块中的's实用程序。(注意:Mac用户可能在Unicode NFC规范化可以增加字符串的长度吗?,unicode,normalization,utf,unicode-normalization,Unicode,Normalization,Utf,Unicode Normalization,如果我对字符串应用Unicode规范化表单C,字符串中的代码点数量会增加吗?是的,在应用NFC规范化后,有些代码点会扩展到多个代码点。例如,在中,有70个代码点在应用NFC规范化后扩展为2个代码点,有2个代码点(中的U+FB2C和U+FB2D)扩展为3个代码点 对于这个所谓的“扩展因子”,您有一个保证,即在应用NFC规范化后,任何字符串的长度扩展都不会超过3倍(就数量而言): 还有一个Unicode联盟的稳定策略,即在所有Unicode版本中,规范映射始终受到限制,因此使用NFC分解时,字符串的
make test
安装步骤中看到错误,表示Perl版本太旧。如果看到此错误,可以通过在CPAN外壳中运行notest install Unicode::Tussle
来安装模块。)
示例:
- 打印BMP中展开为3个代码点的代码点: unichars 'length(NFC) == 3' unichars'长度(NFC)==3' שּׁU+FB2C希伯来文字母SHIN随以DAGESH和SHIN圆点 שּׂU+FB2D希伯来文字母SHIN随以DAGESH和SIN-DOT
- 计算扩展到多个代码点的所有平面中的代码点数量: unichars -a 'length(NFC) > 1' | wc -l unichars-a'长度(NFC)>1'| wc-l 八十五
另请参见常见问题哇,这是一个很大的工作
unichars'length(NFC)>1'| wc-l
对于BMP是72,添加-a
以包括所有平面将产生85。@tchrist:看起来像一个整洁的工具。我必须安装它并试一试:)
unichars -a 'length(NFC) > 1' | wc -l
85