Właśnie znalazłem tę odpowiedź w Internecie:
import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
only_ascii = nfkd_form.encode('ASCII', 'ignore')
return only_ascii
Działa to dobrze (na przykład w języku francuskim), ale myślę, że drugim krokiem (usunięcie akcentów) można by się lepiej zająć niż upuszczenie znaków spoza ASCII, ponieważ nie powiedzie się to w niektórych językach (na przykład po grecku). Najlepszym rozwiązaniem byłoby prawdopodobnie jawne usunięcie znaków Unicode oznaczonych jako znaki diakrytyczne.
Edycja : to załatwia sprawę:
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)
zwróci true, jeśli znak c
można połączyć z poprzednim, to znaczy, jeśli jest to znak diakrytyczny.
Edycja 2 : remove_accents
oczekuje ciągu znaków Unicode , a nie ciągu bajtów. Jeśli masz ciąg bajtów, musisz go zdekodować na ciąg znaków 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)