Enlever les accents d'un string

Signaler
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
-
Whismeril
Messages postés
14239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 février 2020
-
Hello,

Je cherche un moyen d'enlever les accents d'un string, si possible sans passer par du ASCIIEncoding, qui met d'autres charactères à la place.
En gros, j'aimerais une méthode
RemoceAccents("éèàöüä");
qui me retourne "eeaoua".

Les caractères acentués ne sont qu'un exemple, j'aimerais que ça fonctionne quel que soit la langue.

Amicalement, SharpMao

11 réponses

Messages postés
37
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
28 février 2005
1
J'ai fait l'exercice pour le fun, voilà mon code:

static void Main(string[] args)
{
string s = "éàù";
string vData = RemoveAccent(s);
Console.WriteLine(vData);
Console.ReadLine();

}
static string RemoveAccent(string Sentence)
{
char[,] characterCollection = new char[3,2];
characterCollection[0,0] = 'é';
characterCollection[0,1] = 'e';
characterCollection[1,0] = 'à';
characterCollection[1,1] = 'a';
characterCollection[2,0] = 'ù';
characterCollection[2,1] = 'u';

string newSentence = "";
for(int i =0;i < Sentence.Length;i++)
{
string c = Sentence.Substring(i,1);
for(int x=0;x <= characterCollection.GetUpperBound(0);x++)
{
if(c == characterCollection[x,0].ToString())
{
c = characterCollection[x,1].ToString();
break;
}
}
newSentence += c;
}
return newSentence;
}

J'espère que c'est clair ! ;)
merci bcp , bonne courage dans votre parcour :)
Whismeril
Messages postés
14239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 février 2020
344
Bonjour,

voici une solution exhaustive, tous les signes diacritiques sont supprimés:

 /// <summary>
        /// Methode qui supprime les accents et autres signes diacritiques, source http://www.developpez.net/forums/d286030/dotnet/langages/csharp/supprimer-accents-lettre/
        /// </summary>
        /// <param name="stIn"></param>
        /// <returns></returns>
        private string RemoveDiacritics(string stIn)
        {
            string stFormD = stIn.Normalize(NormalizationForm.FormD);
            StringBuilder sb = new StringBuilder();

            for (int ich = 0; ich < stFormD.Length; ich++)
            {
                UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
                if (uc != UnicodeCategory.NonSpacingMark)
                {
                    sb.Append(stFormD[ich]);
                }
            }

            return (sb.ToString().Normalize(NormalizationForm.FormC));
        }
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
53
Le problème, c'est que j'aurais voulu être sur de ne pas oublier de lettre accentuée, quelle que soit la langue utilisée.

P.S. si tu veux le Nième caractère d'un string s tu peux faire s[N]

Amicalement, SharpMao
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
18
il doit avoir une classe dans le framework qui doit faire ca, ou alors qui doit bien aider, mais je la connais pas, je pense par contre à une classe pour les URL qui convertit une url avec des accents sans les accents, par exemple un é en %E9 (je crois) ou un espace en %20 tu peux peut etre te servir de cette classe.

mais j'ai une autre idée completement farfelu : comment fait l'homme pour faire cette operation ?
il voit le caractère et reconnait un u avec un accent, ce que je propose comme solution completement farfelus, c'est de faire une classe qui met ton string dans un dessin, puis apres analyse ce dessin :big)

oui je sais c'est farfelu comme idée, et completement irrealiste pour cause de performance, mais c'est une solution ;)
@+

Cyril
Messages postés
37
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
28 février 2005
1
Le problème c'est que C# en peut pas transformer une lettre en une autre car pour C# 'é' et 'e' sont bien deux lettres bien distinctes avec un code différent, pour ce qui concerne la transformation URL, C# le fait mais cil ne transforme rien, il change une lettre en format URL en code, la lettre est toujours la même.

DOnc je reviens à mon petit exercice, tu dois créer une matrice à la base te permettant de changer tout une phrase avec accent en une phrase sans accent.

Voilà
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
53
Bon,
Comme je n'ai rien trouvé d'autre, je l'ai fait avec un switch case.
C'est pas très élégant, et j'ai sans doute oublié des accents.

<td class=code>private static string RemoveAccents(string PsValue)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
for (int i=0; i

Amicalement, SharpMao
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
18
ouais bof, je suis sur qu'on peut faire mieux qu'une matrice car la il y a beaucoup de risque de se planter

Cyril
Messages postés
37
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
28 février 2005
1
J'ai optimizé mon code et j'ai testé toutes les possibilités avec un copain Senior .Net, voilà le nouveau code et oui la matrice est réellement la seule façon de faire cela:

[STAThread]
static void Main(string[] args)
{
string s = "éàù";
string vData = Class1.RemoveAccent(s);
Console.WriteLine(vData);
Console.ReadLine();

}
public static string RemoveAccent(string Sentence)
{
Hashtable charCollection = new Hashtable();
charCollection.Add('é','e');
charCollection.Add('à','a');
charCollection.Add('ù','u');

string newSentence = "";

PerformanceTimer t = new PerformanceTimer();
t.Start();
for(int i =0;i < Sentence.Length;i++)
{
char c = Sentence[i];
if(charCollection.ContainsKey(c))
{
c = (char) charCollection[c];
}
newSentence += c;
}
t.Stop();

// t.Start();
// foreach(DictionaryEntry entry in charCollection)
// {
// Sentence = Sentence.Replace((char) entry.Key, (char) entry.Value);
// }
// t.Stop();

Console.WriteLine(t.ElapsedTime.ToString());
Console.ReadLine();

return newSentence;
}
Messages postés
37
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
28 février 2005
1
Oups, sorry c'est la bonne ici:

[STAThread]
static void Main(string[] args)
{
string s = "éàù";
string vData = Class1.RemoveAccent(s);
Console.WriteLine(vData);
Console.ReadLine();

}
public static string RemoveAccent(string Sentence)
{
Hashtable charCollection = new Hashtable();
charCollection.Add('é','e');
charCollection.Add('à','a');
charCollection.Add('ù','u');

string newSentence = "";

for(int i =0;i < Sentence.Length;i++)
{
char c = Sentence[i];
if(charCollection.ContainsKey(c))
{
c = (char) charCollection[c];
}
newSentence += c;
}
return newSentence;
}
Messages postés
1
Date d'inscription
vendredi 17 décembre 2004
Statut
Membre
Dernière intervention
17 décembre 2004

Voici un petit code qui permet de reperer tous les codes non ASCII, en modifiant un peu une fonction générique et sure devrait pouvoir être codée :

String filnam="fichié"
System.out.println(filnam);
byte[] filtab=new byte[filnam.length()];
for(int i=0;i<filnam.length();i++){
int x=filnam.charAt(i);

if((x>=0)&&(x<=127)){
filtab[i]=(byte)filnam.charAt(i);
}else{
filtab[i]=(byte)'_';
}
}
filnam=new String(filtab);
System.out.println(filnam);

avant >> fichié
apres >> fichi_

mowZer >:) AH !
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
18
ici http://www.csharpfr.com/forum.v2.aspx?ID=352927&nb=7

il y avait ca.

string chaine="Bonjour, je m'appelle michaël";
chaine=chaine.ToLower();
string nchaine="";
for (int i=0;i<chaine.Length;i++)
{
byte k=(byte)chaine[i];
if (k>223 && k<231) nchaine+="a";
if (k>231 && k<236) nchaine+="e";
if (k>235 && k<240) nchaine+="i";
if (k>241 && k<247) nchaine+="o";
if (k>248 && k<253) nchaine+="u";
if (k==231) nchaine+="c";
if (k>96 && k<123) nchaine+=chaine[i];
}

c'est quand meme un peu mieux :)
Cyril
Messages postés
7
Date d'inscription
samedi 26 avril 2003
Statut
Membre
Dernière intervention
14 mars 2005

Voici une solution que je trouve génial : http://www.vbfrance.com/code.aspx?id=25946