Python与字符规范化

22

你好,我从外部数据源检索基于UTF8编码的文本数据,其中包含特殊字符,例如u"ıöüç",而我希望将它们标准化为英语形式,如"ıöüç" -> "iouc"。最佳方法是什么?


搜索和替换可能需要一个完整的特殊字符到正常字符数组。 - soulseekah
4个回答

43

我建议使用Unidecode模块

>>> from unidecode import unidecode
>>> unidecode(u'ıöüç')
'iouc'

注意传递给它的是一个Unicode字符串,输出的是一个字节字符串。输出保证为ASCII编码。


7
这完全取决于您想在转写结果中走多远。如果您想将所有内容都转换为ASCII(αβγ 转换为 abg ),那么 unidecode 是正确的选择。
如果您只想从带重音的字母中去除重音,那么可以尝试使用规范化形式 NFKD 对字符串进行分解(这将把带重音的字母 á 转换为普通字母 a,后面跟着 U+0301 COMBINING ACUTE ACCENT),然后丢弃重音(属于 Unicode 字符类 Mn——"标记、非间隔") 。
import unicodedata

def remove_nonspacing_marks(s):
    "Decompose the unicode string s and remove non-spacing marks."
    return ''.join(c for c in unicodedata.normalize('NFKD', s)
                   if unicodedata.category(c) != 'Mn')

2
我发现最简单的方法是: unicodedata.normalize('NFKD', s).encode("ascii", "ignore")

0

1
我有点困惑:我尝试了print unicodedata.normalize('NFKD', u"ıöüç"),输出结果仍然是:ıöüç。 - Hellnar
尝试使用其他有效值,如“NFC”、“NFKC”、“NFD”和“NFKD”。 - soulseekah
2
我相当确定这不是问题提出者寻找的操作。但是没错,这是Unicode规范化。他所询问的通常不被称为这样。 - drxzcl
1
没错,我想这被称为音译 - soulseekah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接