Unicode NFC规范化可以增加字符串的长度吗?

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分解时,字符串的

如果我对字符串应用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用户可能在
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