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 (suppression des accents) pourrait être mieux gérée que la suppression des caractères non-ASCII, car cela échouera pour certaines langues (le grec, par exemple). La meilleure solution serait probablement de supprimer explicitement les caractères unicode qui sont marqués comme étant des diacritiques.
Modifier Le résultat : ceci 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-à-dire principalement s'il s'agit d'un diacritique.
Edit 2 : remove_accents
s'attend à ce qu'un unicode et non une chaîne d'octets. Si vous avez une chaîne d'octets, vous devez la décoder en une chaîne unicode comme ceci :
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)