【问题标题】:Normalization does not preserve code point规范化不保留代码点
【发布时间】:2015-08-09 10:15:19
【问题描述】:

谁能解释一下为什么 U+2126 (Ω) 和 U+03A9 (Ω) 的 NFD 归一化会产生相同的表示并且不保留代码点?我预计这种行为仅适​​用于 NFKD 和 NFKC(以及带有变音符号的字符)。

result1 = unicodedata.normalize("NFD", u"\u2126")
result2 = unicodedata.normalize("NFD", u"\u03A9")
print("NFD: " + repr(result1))
print("NFD: " + repr(result2))

输出:

NFD: u'\u03a9'
NFD: u'\u03a9'

【问题讨论】:

    标签: unicode character-encoding


    【解决方案1】:

    这些被称为“单例分解”,存在于 Unicode 中为与现有标准兼容而存在的 U+2126 (Ω) 等字符。它们不是“兼容性分解”(如 U+1D6C0 ?),因为它们在视觉和语义上都与另一个代码点(在本例中为 U+03A9 Ω)相同。

    因为它们本质上复制了另一个代码点,所以选择一个作为“首选形式”,而另一个在规范化时总是被它替换(任何形式)。第一种形式基本上已被弃用。

    【讨论】:

    • 感谢您向我指出此答案,我已将 my question 标记为重复项。这解释了为什么 ICU 标准化器会以它的方式工作 - details here, for reference。我仍然很难理解为什么 Unicode 会这样工作。希腊问号 (U+037E) 真的 在语义上与分号 (U+003B) 相同吗?或者另一个例子:U+2000 分解为 U+2002。看起来它们都是同时添加的——那为什么还要在标准中包含 U+2000?
    • 感觉我对 Unicode 了解得越多,我知道的就越少……我想我真正想要的是一个讨论这些问题的地方,比如邮件列表、新闻组或论坛.到目前为止,我还没有找到。
    • 语义相同?一点也不。这就是两个代码点都存在的原因——如果你需要语义区分,你不应该规范化。但是,在许多情况下,这可以从上下文中确定,并且具有两个视觉上相同的字符只会导致问题,因此 Unicode 标准为它们提供了规范的等价物。 Unicode 联盟运营mailing list,您可能会觉得有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2016-04-14
    • 2010-12-29
    • 2013-12-16
    • 2011-03-17
    • 2013-01-22
    相关资源
    最近更新 更多