2024-05-15 02:03:38 发布
网友
再一次,我对unicode问题感到困惑。我不知道如何成功地使用unicodedata.normalize来按预期转换非ASCII字符。例如,我想转换字符串
u"Cœur"
到
u"Coeur"
我很确定unicodedata.normalize是实现这一点的方法,但我不能让它工作。它只是保持字符串不变。
>>> s = u"Cœur" >>> unicodedata.normalize('NFKD', s) == s True
我做错什么了?
正如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.htmhttp://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
正如jsbueno所说,有些字母没有兼容性分解。
可以使用Unicode CLDR Latin-ASCII transform生成手动替换的映射。
您的问题似乎与Python无关,但您要分解的字符(u'\u0153'-'œ')本身并不是一个组合。
在代码处理包含“ç”和“ã”等常规组合字符的字符串时进行检查:
然后,如果您检查两个字符(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手动替换序列中的字符,就像它听起来那么老套。
你可以试试^{} :
相关问题 更多 >
编程相关推荐