unicodedata.decomposition()与unicodedata.normalize(NFD / NFKD)?

时间:2018-03-12 10:41:32

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

根据py3 doc

  

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
>>>

2 个答案:

答案 0 :(得分:2)

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

  

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

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

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

答案 1 :(得分:1)

映射以Unicode标准定义。

K是&#34;兼容性&#34;。 Unicode必须在Unicode中插入一些代码,以便能够在不丢失信息的情况下进行往返。 &#34; K&#34;转换将删除此类&#34;额外/不需要的&#34;字符(不应该是Unicode,其他规则)。

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

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

所以不应该使用K,而是用于特定用途。其中一种用途是用于字符串搜索,或查看一个用户名是否与其他用户名太相似(可能无法区分)[但只是&#39; K&#39;还不够。]

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

因此,对于分解的字符(基本+组合代码),我们有D,而具有更紧凑的符号的C(如果有这样的组合可用)。这些转换也在Unicode标准中描述(几乎没有历史特殊情况和&#34;错误&#34;)。

相关问题