【问题标题】:Can Unicode NFC normalization increase the length of a string?Unicode NFC 标准化可以增加字符串的长度吗?
【发布时间】:2013-07-27 16:17:11
【问题描述】:

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

【问题讨论】:

    标签: unicode normalization utf unicode-normalization


    【解决方案1】:

    是的,应用 NFC 规范化后,有些代码点会扩展为多个代码点。例如,Basic Multilingual Plane 内有 70 个码点在应用 NFC 归一化后扩展为 2 个码点,并且有 2 个码点(Alphabetic Presentation Forms block 内的 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 来安装模块。)

    例子:

    • 打印 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

    另见常见问题What are the maximum expansion factors for the different normalization forms?

    【讨论】:

    • 哇,工作量很大。 unichars 'length(NFC) > 1' | wc -l 是 BMP 的 72,添加 -a 以包含所有平面会产生 85。
    • @tchrist: unichars 看起来像一个简洁的工具。我必须安装它并试一试:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2021-11-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多