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

Dan*_*ien 3 unicode normalization utf unicode-normalization

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

Dan*_*ien 7

是的,在应用NFC规范化后,有一些代码点可以扩展到多个代码点.内的基本多语种平面,例如,有施加NFC归一化之后扩大至2个点70个的代码点,并且有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 Christiansenunichars实用程序,它是Unicode :: Tussle CPAN模块的一部分.(注意:Mac用户可能会在make test安装步骤中看到错误,说Perl版本太旧了.如果看到此错误,可以通过notest install Unicode::Tussle在CPAN shell中运行来安装模块.)

例子:

  • 在BMP中打印扩展到3个代码点的代码点:

    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

另请参见常见问题不同标准化表格的最大扩展因子是什么?

  • 哇,这是很多工作.`unichars'长度(NFC)> 1'| 对于BMP,wc -l`为72,并且添加"-a"以包括所有平面,得到85. (2认同)