在Python 2.7中使用unicodata.normalize

在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'-“œ”

我再一次被一个unicode问题弄糊涂了。我不知道如何按预期成功地使用转换非ASCII字符。例如,我想转换字符串

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