Je viens de trouver cette réponse sur le 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
Cela fonctionne bien (pour le français, par exemple), mais je pense que la deuxième étape (supprimer les accents) pourrait être mieux gérée que de supprimer les caractères non ASCII, car cela échouera pour certaines langues (grec, par exemple). La meilleure solution serait probablement de supprimer explicitement les caractères unicode qui sont étiquetés comme étant des signes diacritiques.
Edit : cela fait l'affaire:
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)
retournera vrai si le caractère c
peut être combiné avec le caractère précédent, c'est principalement s'il s'agit d'un diacritique.
Edit 2 : remove_accents
attend une chaîne unicode , pas une chaîne d'octets. Si vous avez une chaîne d'octets, vous devez la décoder en une chaîne unicode comme celle-ci:
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)