通常我使用unicodedata
来规范其他拉丁语文本。但是,我遇到了这个问题,不确定该怎么做:
s = 'Nguyễn Văn Trỗi'
>>> unicodedata.normalize('NFD', s)
'Nguyễn Văn Trỗi'
是否有另一个模块可以比unicodedata
标准化更多的重音符号?我想要的输出是:
Nguyen Van Troi
答案 0 :(得分:1)
normalize
并不意味着“去除口音”。它在组合形式和分解形式之间进行转换:
>>> import unicodedata as ud
>>> a = 'ă'
>>> print(ascii(ud.normalize('NFD',a))) # LATIN SMALL LETTER A + COMBINING BREVE
'a\u0306'
>>> print(ascii(ud.normalize('NFC',a))) # LATIN SMALL LETTER A WITH BREVE
'\u0103'
删除它们的一种方法是将分解后的形式编码为ASCII忽略错误,这是有效的,因为合并字符不是ASCII。但是请注意,并非所有国际字符都具有分解形式,例如đ。
>>> s = 'Nguyễn Văn Trỗi'
>>> ud.normalize('NFD',s).encode('ascii',errors='ignore').decode('ascii')
'Nguyen Van Troi'
>>> s = 'Ngô Đình Diệm'
>>> ud.normalize('NFD',s).encode('ascii',errors='ignore').decode('ascii')
'Ngo inh Diem' # error
您可以使用翻译表解决异常:
>>> table = {ord('Đ'):'D',ord('đ'):'d'}
>>> ud.normalize('NFD',s).translate(table).encode('ascii',errors='ignore').decode('ascii')
'Ngo Dinh Diem'