Normalisation de String
Par Cédric Tabin le vendredi 30.07.2010, 22:53 - Java - Lien permanent
Il arrive souvent de devoir normaliser une chaîne de caractère (supprimer des accents ainsi que certains caractères spéciaux). Et c'est très facile !
La première étape est d'utiliser la classe Normalizer qui va s'occuper de décomposer les caractères spéciaux :
String text = "eéèêëẽ aàáâäã oóòôöõ uùúûüũ iíìîïĩ yýỳŷÿỹ nñ"; String normalized = Normalizer.normalize(text, Normalizer.Form.NFD); System.out.println("Source : "+text); System.out.println("Normalized : "+normalized);
Cela va faire que chaque caractère accentué sera décomposé en un caractère ASCII (la lettre), suivi d'un caractère spécial représentant l'accent.
Toutefois, si on s'arrête à ce stade, il n'y a aucun changement entre les deux String. Et pour cause, la méthode String.toString() s'occupe de reconstituer la chaîne de caractère originale (il est important de noter que Java stocke les chaînes de caractères au format UTF-16).
Pour terminer la normalisation, il suffit de supprimer tous les caractères non ASCII de la chaînes de caractères. Et pour cela, les RegExp sont nos amies :
String ascii1 = text.replaceAll("[^\\p{ASCII}]", ""); String ascii2 = normalized.replaceAll("[^\\p{ASCII}]", ""); System.out.println("Ascii from source : "+ascii1); System.out.println("Ascii from normalized : "+ascii2);
Au final, la chaîne sans accent est obtenue :
Source : eéèêëẽ aàáâäã oóòôöõ uùúûüũ iíìîïĩ yýỳŷÿỹ nñ Normalized : eéèêëẽ aàáâäã oóòôöõ uùúûüũ iíìîïĩ yýỳŷÿỹ nñ Ascii from source : e a o u i y n Ascii from normalized : eeeeee aaaaaa oooooo uuuuuu iiiiii yyyyyy nn
Commentaires
Un peu Jo la bricole comme truc mais j'aime bien l'idée Mais y a rien dans l'API Java qui peut faire ça sans cette bidouille ?