Я щойно знайшов цю відповідь в Інтернеті:
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)])
unicodedata.combining(c)
повернеться істиною, якщо персонаж c
можна поєднати з попереднім символом, тобто головним чином, якщо це діакритичний знак.
Редагувати 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)