根据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
>>>
答案 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和字符之外)。
问题:使用下标,只得到数字,所以改变含义,例如: 4²
已转换为42
。 K将删除文本的一些语义(首先不应该存在,但只是分解不够好)
所以不应该使用K,而是用于特定用途。其中一种用途是用于字符串搜索,或查看一个用户名是否与其他用户名太相似(可能无法区分)[但只是&#39; K&#39;还不够。]
D是标准化:D会将字符分解为组件,因此ê
会转换为e
和组合字符^
。这也是Unicode的一个目标:将所有字符编码为65366代码是不可实现的,因此字符是由组成的。 (这在汉字中很明显)。同样,为了兼容性和往返,增加了一些重音字符,后来Unicode扩展到超过65536个代码。
因此,对于分解的字符(基本+组合代码),我们有D,而具有更紧凑的符号的C(如果有这样的组合可用)。这些转换也在Unicode标准中描述(几乎没有历史特殊情况和&#34;错误&#34;)。