[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.

Art ascii lettre caractère accentué
Art ascii, lettres et caractères accentués
//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
  • word retirer les accents
  • supprimer accent c#
  • retirer un espace a chaque boucle c#
  • c# string supprimer accent
  • supprimer accent excel
  • enlever les caractères spéciaux c net
  • c# supprimer accent caractère

7 commentaires sur « [C#] Supprimer les accents d’une chaine de caractères »

  1. 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 )

  2. 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 ?

  3. 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…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.