规范外文

时间:2020-03-26 01:02:19

标签: python unicode

通常我使用unicodedata来规范其他拉丁语文本。但是,我遇到了这个问题,不确定该怎么做:

s = 'Nguyễn Văn Trỗi'
>>> unicodedata.normalize('NFD', s)
'Nguyễn Văn Trỗi'

是否有另一个模块可以比unicodedata标准化更多的重音符号?我想要的输出是:

Nguyen Van Troi

1 个答案:

答案 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'