Я только что нашел этот ответ в Интернете:
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, потому что это не получится для некоторых языков (например, греческого). Лучшим решением, вероятно, было бы явное удаление символов Юникода, которые помечены как диакритические.
Изменить : это делает трюк:
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)])
unicodedata.combining(c)
вернет true, если символ c
может быть объединен с предыдущим символом, то есть главным образом, если это диакритический знак.
Редактирование 2 : remove_accents
ожидает строку в юникоде , а не строку байта. Если у вас есть строка байтов, то вы должны декодировать ее в строку 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)