Acabo de encontrar esta respuesta en la 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
Funciona bien (para francés, por ejemplo), pero creo que el segundo paso (eliminar los acentos) podría manejarse mejor que soltar los caracteres que no son ASCII, porque esto fallará en algunos idiomas (griego, por ejemplo). La mejor solución probablemente sería eliminar explícitamente los caracteres unicode que están etiquetados como diacríticos.
Editar : esto hace el truco:
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)
devolverá verdadero si el carácter c
se puede combinar con el carácter anterior, esto es principalmente si es un signo diacrítico.
Edición 2 : remove_accents
espera una cadena unicode , no una cadena de bytes. Si tiene una cadena de bytes, debe decodificarla en una cadena unicode como esta:
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)