【问题标题】:unicodedata.decomposition() vs. unicodedata.normalize(NFD/NFKD)?unicodedata.decomposition() 与 unicodedata.normalize(NFD/NFKD)?
【发布时间】:2018-08-20 08:28:12
【问题描述】:

根据py3doc

unicodedata.decomposition(chr)

将分配给字符chr 的字符分解映射作为字符串返回。一个空字符串是 如果没有定义这样的映射,则返回。

这里我不太明白字符分解映射是怎么定义的,unicodedata.decomposition()unicodedata.normalize(NFD/NFKD)有什么关系/区别?

请参阅以下示例:

$ python3
>>> import unicodedata
>>> unicodedata.decomposition('⑴')
'<compat> 0028 0031 0029'              <-- why not just '0028 0031 0029'?
>>> unicodedata.normalize('NFKD', '⑴')
'(1)'
>>> unicodedata.decomposition('①')
'<circle> 0031'                        <-- why not just '0031'?
>>> unicodedata.normalize('NFKD', '①')
'1'
>>> unicodedata.decomposition('è')
'0065 0300'                            <-- like this?
>>> unicodedata.normalize('NFD', 'è') == '\u0065\u0300'
True
>>>

【问题讨论】:

    标签: python python-3.x unicode python-unicode


    【解决方案1】:

    unicodedata.decomposition 返回Unicode Character Database 中使用的单个代码点in the format 的分解类型和映射。来自 UAX #44:

    Decomposition_Type、Decomposition_Mapping:此字段包含两个值,类型在尖括号中。

    如果尖括号中没有类型,则代码点具有在 NFC 和 NFD 中使用的规范分解。如果尖括号中有一个类型,则代码点有一个兼容性分解,除了规范分解之外,NFKC 和 NFKD 还使用它。

    unicodedata.normalize 实现了整个字符串的 Unicode 规范化算法。

    【讨论】:

      【解决方案2】:

      映射在 Unicode 标准中定义。

      K 是“兼容性”。 Unicode 必须在 Unicode 中插入一些代码,以便能够进行往返而不丢失信息。 “K”转换将删除这些“多余/不需要”的字符(根据其他规则,这些字符不应该是 Unicode)。

      因此,下标数字、上标数字、分数和带圆圈的数字(在您的示例中)被转换(它们应该是标准数字 + 标记格式(在 Unicode 和字符之外)。

      问题:使用下标,只能得到数字,因此改变了含义,例如 转换为 42。 K 将删除文本的一些语义(首先不应该存在,但仅仅分解还不够好)

      所以 K 不应该被使用,而是用于特定用途。其中一种用途是用于字符串搜索,或者查看一个用户名是否与其他用户名过于相似(可能无法区分)[但仅 'K' 是不够的]。

      D 是一个规范化:D 将字符分解为组件,因此ê 被转换为e 和组合字符^。这也是 Unicode 的目标之一:将所有字符编码成 65366 码是不可实现的,所以字符是组合的。 (这在汉字中最常见)。同样,为了兼容性和往返,添加了一些重音字符,后来 Unicode 扩展到超过 65536 个代码。

      所以我们有 D 表示分解的字符(基本 + 组合代码),而 C 有更紧凑的符号(如果有这样的组合)。这些转换也在 Unicode 标准中进行了描述(很少有历史特殊情况和“错误”)。

      【讨论】:

      • 我希望 unicodedata.decomposition('⑴') 返回 0028 0031 0029 而不是 &lt;compat&gt; 0028 0031 0029。或者换一种说法,既然我们已经有了normalize(NFD/NFKD),为什么还需要decomposition()差异是什么?
      • 实际上,你是对的。 unicode.org/charts/normalization/chart_Number-Other.htmlunicode.org/charts/normalization 中的索引)。现在我正在寻找添加&lt;compact&gt; 的位置。我在解释时忽略了它。
      • 查看其他答案。对,“分解”还添加了描述,以便给程序一些关于如何进行的提示。这是每个映射的列表:compart.com/en/unicode/decomposition
      猜你喜欢
      • 1970-01-01
      • 2020-05-15
      • 2012-10-08
      • 2019-01-13
      • 2019-04-08
      • 2013-01-18
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      相关资源
      最近更新 更多