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.

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