Ho appena trovato questa risposta sul Web:
import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
only_ascii = nfkd_form.encode('ASCII', 'ignore')
return only_ascii
Funziona bene (per il francese, per esempio), ma penso che il secondo passo (rimuovere gli accenti) potrebbe essere gestito meglio che eliminare i caratteri non ASCII, perché questo fallirà per alcune lingue (greco, per esempio). La soluzione migliore sarebbe probabilmente quella di rimuovere esplicitamente i caratteri unicode che sono etichettati come segni diacritici.
Modifica : questo fa il trucco:
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)
tornerà vero se il personaggio c
può essere combinato con il carattere precedente, questo è principalmente se è un carattere diacritico.
Modifica 2 : si remove_accents
aspetta una stringa unicode , non una stringa di byte. Se hai una stringa di byte, devi decodificarla in una stringa unicode come questa:
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)