[C#] Supprimer les accents d’une chaine de caractères
Interdire l’utilisation de caractères spécifiques dans un texte et devoir les remplacer automatiquement par d’autres caractères est courant. Malheureusement il n’existe pas de fonction toutes faites permettant de le faire. Ci dessous je vous propose donc une fonction qui vous permettra de mettre à jour vos textes en enlevant tous les caractères accentués.
La fonction « Suppression Caractère accentué » ci dessous est la plus rapide que j’ai pu trouvé aujourd’hui pour mettre à jour une chaine de X caractères. L’utilisation de conditions if imbriquées ne semble à premier abord pas forcément des plus performantes. Elles ont néanmoins l’intérêt de permettre de ne pas tester a chaque fois l’ensemble des cas possibles. Pour optimiser encore plus l’utilisation de celle-ci le test des ifs devra être classé par ordre de prédominance de chacun des caractères rencontrés dans le texte.
//Le but de cette fonction est de remplacer un ensemble de caractères prédéfinis par d'autres dans un string. private string Suppression_Caractere_accentue(string Texte_a_corriger) { //Conversion du string en tableau de char char[] ligne_char = Texte_a_corriger.ToCharArray(); int mchar; for (int i = 0; i < Texte_a_corriger.Length; i++) { //Conversion du caractere en int mchar = (int)ligne_char[i]; //MAJUSCULES // remplacement des accents par A if (mchar >= 192 && mchar <= 198) { ligne_char[i] = 'A';//(char)65; }else // remplacement des accents par E if (mchar >= 200 && mchar <= 203) { ligne_char[i] = 'E';//(char)69; }else // remplacement des accents par I if (mchar >= 204 && mchar <= 207) { ligne_char[i] = 'I';//(char)73; }else // remplacement des accents par O if (mchar >= 210 && mchar <= 216 && mchar != 215) { ligne_char[i] = 'O';//(char)79; }else // remplacement des accents par U if (mchar >= 217 && mchar <= 220) { ligne_char[i] = 'U';//(char)85; }else // remplacement des ç par C if (mchar == 199) { ligne_char[i] = 'C';//(char)67; }else // remplacement des Ð par D if (mchar == 208 ) { ligne_char[i] = 'D';//(char)68; }else // remplacement des Ñ par N if (mchar == 209 ) { ligne_char[i] = 'N';//(char)78; } else // remplacement des Ý par Y if (mchar == 221 ) { ligne_char[i] = 'Y';//(char)89; }else //MINUSCULE // remplacement des accents par A if (mchar >= 224 && mchar <= 230) { ligne_char[i] = 'a';//(char)97; } else // remplacement des accents par E if (mchar >= 232 && mchar <= 235) { ligne_char[i] = 'e';//(char)101; } else // remplacement des accents par I if (mchar >= 236 && mchar <= 239) { ligne_char[i] = 'i';//(char)105; } else // remplacement des accents par O if (mchar >= 242 && mchar <= 248) { ligne_char[i] = 'o';//(char)111; } else // remplacement des accents par U if (mchar >= 249 && mchar <= 252) { ligne_char[i] = 'u';//(char)117; } else // remplacement des ç par C if (mchar == 231 ) { ligne_char[i] = 'c';//(char)99; } else // remplacement des Ð par D if (mchar == 208) { ligne_char[i] = 'd';//(char)100; } else // remplacement des Ñ par N if (mchar == 241 ) { ligne_char[i] = 'n';//(char)110; } else // remplacement des Ý par Y if (mchar == 253 || mchar == 255) { ligne_char[i] = 'y';//(char)121; } else // remplacement des ° par if (mchar == 176) { ligne_char[i] = ' '; } } //Conversion du tableau de char[] en string return new string(ligne_char); } |
Ci dessous, pour historique, je vous propose deux autres méthodes que j’utilisais pour supprimer ou remplacer des caractères d’un string.
Elles sont en gros trois fois plus lentes que la méthode décrite ci-dessus. (Environ 371 ms au lieu de 121 ms pour un fichier de 3 497 984 caractères soit environ 1Mo).
Il est en fait assez logique qu’elles soient plus lentes que la précédente méthode puisqu’elles obligent à re-tester l’ensemble des caractères de remplacement pour chaque caractères de la chaine.
Par contre, dans le cas présent c’est un bon moyen de se rendre compte que les deux Instructions d’itération (la boucle for et l’instruction foreach) sont aussi rapide l’une que l’autre dans ce cas précis. (D’un point de vue optimisation on pourra donc aussi bien choisir l’une que l’autre.
Méthode de conversion avec une boucle foreach
private string ConvertirChaineSansAccent(string texte) { if ((texte != null)&&(texte != string.Empty)) { char[] oldChar = { 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'à', 'á', 'â', 'ã', 'ä', 'å', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'È', 'É', 'Ê', 'Ë', 'è', 'é', 'ê', 'ë', 'Ì', 'Í', 'Î', 'Ï', 'ì', 'í', 'î', 'ï', 'Ù', 'Ú', 'Û', 'Ü', 'ù', 'ú', 'û', 'ü', 'ÿ', 'Ñ', 'ñ', 'Ç', 'ç', '°' }; char[] newChar = { 'A', 'A', 'A', 'A', 'A', 'A', 'a', 'a', 'a', 'a', 'a', 'a', 'O', 'O', 'O', 'O', 'O', 'O', 'o', 'o', 'o', 'o', 'o', 'o', 'E', 'E', 'E', 'E', 'e', 'e', 'e', 'e', 'I', 'I', 'I', 'I', 'i', 'i', 'i', 'i', 'U', 'U', 'U', 'U', 'u', 'u', 'u', 'u', 'y', 'N', 'n', 'C', 'c', ' ' }; int i = 0; foreach (char monc in oldChar) { texte = texte.Replace(monc, newChar[i]); i++; } } return texte; } |
Cette fonction est en moyenne exécutée en 371 ms.
Méthode de conversion avec une boucle for
//Fonction qui supprime les accents et autres caractères spéciaux d'un string private string ConvertirChaineSansAccentFOR(string libelle) { if ((libelle != null)&&(libelle != string.Empty)) { char[] oldChar = { 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'à', 'á', 'â', 'ã', 'ä', 'å', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'È', 'É', 'Ê', 'Ë', 'è', 'é', 'ê', 'ë', 'Ì', 'Í', 'Î', 'Ï', 'ì', 'í', 'î', 'ï', 'Ù', 'Ú', 'Û', 'Ü', 'ù', 'ú', 'û', 'ü', 'ÿ', 'Ñ', 'ñ', 'Ç', 'ç', '°' }; char[] newChar = { 'A', 'A', 'A', 'A', 'A', 'A', 'a', 'a', 'a', 'a', 'a', 'a', 'O', 'O', 'O', 'O', 'O', 'O', 'o', 'o', 'o', 'o', 'o', 'o', 'E', 'E', 'E', 'E', 'e', 'e', 'e', 'e', 'I', 'I', 'I', 'I', 'i', 'i', 'i', 'i', 'U', 'U', 'U', 'U', 'u', 'u', 'u', 'u', 'y', 'N', 'n', 'C', 'c', ' ' }; for (int i = 0; i < oldChar.Length; i++) { libelle = libelle.Replace(oldChar[i], newChar[i]); } } return libelle; } |
Cette fonction est en moyenne exécutée en 368 ms.
En espérant que ce petit bout de code C# pour faire le ménage dans vos chaines de caractères vous sera utilise. D’autres articles en rapport avec le C# sont disponible ici :
Mots clefs liés à cet article:
- c# supprimer les accents
- c# remplacer caractère accentué
- c# remove accents string
Merci, c’est exactement ce que je cherchais 😉
De rien. Hum dis moi code4fun avec la page » content is king ? » c’est pour un concours de référencement?
L’article sur la suppression des accents t’a vraiment servi ou c’est juste pour le backlink (bon mon site va pas t’apporter grand chose pour ça :p )
Hello, oui je participe à un concours seo ^^
Je suis développeur .net en alternance et je me suis effectivement servie de ton astuce ce matin 😉
Okip. Bonne chance alors 😉
Merci beaucoup!!
La rapidité d’exécution de ta première méthode n’est-elle pas plus lente si les chaînes de caractères traitées sont plus petites que la taille de ton dictionnaire ?
En fonction de la taille de la chaîne de caractère/dictionnaire ne serait-il pas judicieux d’opter pour l’une ou l’autre des méthodes ?
Bonjour Hybris,
Merci pour ton commentaire.
Le but de la méthode de remplacement de caractères décrite ci dessus est d’être utilisée avec de gros textes (ici testé avec un texte de 3.5 millions de caractères).
Pour de petits textes, la différence sera négligeable a moins de s’amuser a appeler X fois cette méthode par seconde. Après, tout est question d’optimisation en fonction du cas traité.
Il faudrait aussi du coup chercher ce que fait exactement le code natif. Il est fort possible que lui même fasse une imbrication de boucle if…