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

时间:2013-07-27 11:59:50

标签: unicode normalization utf unicode-normalization

如果我将Unicode规范化表格C应用于字符串,字符串中的代码点数量是否会增加?

1 个答案:

答案 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 Christiansenunichars实用程序,它是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?