在Python 2.7中使用unicodata.normalize
我再一次被一个unicode问题弄糊涂了。我不知道如何按预期成功地使用转换非ASCII字符。例如,我想转换字符串在Python 2.7中使用unicodata.normalize,python,python-2.7,unicode,normalization,unicode-normalization,Python,Python 2.7,Unicode,Normalization,Unicode Normalization,我再一次被一个unicode问题弄糊涂了。我不知道如何按预期成功地使用转换非ASCII字符。例如,我想转换字符串 u"Cœur" 到 我非常确定unicodata.normalize是实现这一点的方法,但我无法让它工作。它只是保持字符串不变 >>> s = u"Cœur" >>> unicodedata.normalize('NFKD', s) == s True 我做错了什么?您的问题似乎与Python无关,但您试图分解的字符(u'\u0153'-“œ”
u"Cœur"
到
我非常确定unicodata.normalize是实现这一点的方法,但我无法让它工作。它只是保持字符串不变
>>> s = u"Cœur"
>>> unicodedata.normalize('NFKD', s) == s
True
我做错了什么?您的问题似乎与Python无关,但您试图分解的字符(u'\u0153'-“œ”)本身并不是一个组合 在代码使用包含“ç”和“ã”等普通复合字符的字符串时进行检查: 然后,如果您检查两个字符(您的和c+cedila)的unicode引用,您将看到后者有一个“分解”规范,而前者缺少:
就像“œ”在形式上并不等同于“oe”-(至少对定义这个unicode部分的人来说不是这样)-因此,规范包含这个部分的文本的方法是用unicode.replace手动替换序列中的字符-听起来很粗糙。,正如jsbueno所说,有些字母没有兼容性分解 您可以使用生成手动替换的映射。您可以尝试:
事实上,我不确定unicodata.normalize是我想要的。但我确实找到了解决办法。这是一个很好的答案。简洁明了,完成任务。
>>> s = u"Cœur"
>>> unicodedata.normalize('NFKD', s) == s
True
>>> a1 = a
>>> a = u"maçã"
>>> for norm in ('NFC', 'NFKC', 'NFD','NFKD'):
... b = unicodedata.normalize(norm, a)
... print b, len(b)
...
maçã 4
maçã 4
maçã 6
maçã 6
# -*- coding: utf-8 -*-
from unidecode import unidecode # $ pip install unidecode
print(unidecode(u"Cœur"))
# -> Coeur