3

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

4

1 回答 1

7

是的,在应用 NFC 标准化后,有些代码点会扩展为多个代码点。例如,在Basic Multilingual Plane中,有 70 个码点在应用 NFC 规范化后扩展为 2 个码点,并且有 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 '长度(NFC)== 3'
    שּׁ U+FB2C HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
    שּׂ U+FB2D HEBREW LETTER SHIN WITH DAGESH 和 SIN DOT
  • 计算所有平面中扩展到多个代码点的代码点数:

    unichars -a '长度(NFC)> 1' | wc -l
          85

另请参阅常见问题不同归一化形式的最大扩展因子是什么?

于 2013-07-27T11:59:49.517 回答