我刚在网上找到这个答案:import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
only_ascii = nfkd_form.encode('ASCII', 'ignore')
return only_ascii
它工作得很好(例如法语),但我认为第二步(删除重音符号)可以比删除非ASCII字符处理得更好,因为对于某些语言(例如希腊语)这将失败。最好的解决方案可能是显式删除被标记为变音符号的unicode字符。
编辑:这样做的诀窍是:import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
return u"".join([c for c in nfkd_form if not unicodedata.combining(c)])
如果字符c可以与前面的字符组合,即主要是变音符号,则unicodedata.combining(c)将返回true。
编辑2:remove_accents需要一个unicode字符串,而不是一个字节字符串。如果有字节字符串,则必须将其解码为如下unicode字符串:encoding = "utf-8" # or iso-8859-15, or cp1252, or whatever encoding you use
byte_string = b"café" # or simply "café" before python 3.
unicode_string = byte_string.decode(encoding)