在Python2.7中使用unicodedata.normalize

2024-05-15 02:03:38 发布

您现在位置:Python中文网/ 问答频道 /正文

再一次,我对unicode问题感到困惑。我不知道如何成功地使用unicodedata.normalize来按预期转换非ASCII字符。例如,我想转换字符串

u"Cœur"

u"Coeur"

我很确定unicodedata.normalize是实现这一点的方法,但我不能让它工作。它只是保持字符串不变。

>>> s = u"Cœur"
>>> unicodedata.normalize('NFKD', s) == s
True

我做错什么了?


Tags: 方法字符串trueasciiunicode字符normalizeur
3条回答

正如jsbueno所说,有些字母没有兼容性分解。

可以使用Unicode CLDR Latin-ASCII transform生成手动替换的映射。

您的问题似乎与Python无关,但您要分解的字符(u'\u0153'-'œ')本身并不是一个组合。

在代码处理包含“ç”和“ã”等常规组合字符的字符串时进行检查:

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

然后,如果您检查两个字符(yours和c+cedila)的unicode引用,您将看到后者有一个前者缺少的“分解”规范:

http://www.fileformat.info/info/unicode/char/153/index.htm
http://www.fileformat.info/info/unicode/char/00e7/index.htm

就像“œ”在形式上并不等同于“oe”(至少不适用于定义这个unicode部分的人),所以,规范化包含此内容的文本的方法是用unicode.replace手动替换序列中的字符,就像它听起来那么老套。

你可以试试^{}

# -*- coding: utf-8 -*-
from unidecode import unidecode # $ pip install unidecode

print(unidecode(u"Cœur"))
# -> Coeur

相关问题 更多 >

    热门问题