129 votes

Ignorant les lettres accentuées en comparaison de chaînes

J’ai besoin de comparer 2 chaînes en langage c# et de traiter les lettres accentuées les mêmes lettres non accentués. Par exemple :

Ces 2 cordes doivent être les mêmes (en ce qui concerne ma demande est), mais ces deux affirmations ont la valeur false. Est-il possible en langage c# pour cela ?

238voto

Serge - appTranslator Points 11916

EDIT 2012-01-20: Oh boy! La solution était tellement plus simple et a été dans le cadre presque jamais. Comme l'a souligné knightpfhor :

string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);

Voici une fonction qui supprime les signes diacritiques à partir d'une chaîne:

static string RemoveDiacritics(string text)
{
  string formD = text.Normalize(NormalizationForm.FormD);
  StringBuilder sb = new StringBuilder();

  foreach (char ch in formD)
  {
    UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(ch);
    if (uc != UnicodeCategory.NonSpacingMark)
    {
      sb.Append(ch);
    }
  }

  return sb.ToString().Normalize(NormalizationForm.FormC);
}

Plus de détails sur MichKap du blog.

Le principe est qu'il tourne 'é' en 2 successives de caractères "e", aiguë. Ensuite, il parcourt les caractères et ignore les signes diacritiques.

"héllo" devient "il<aiguë>llo", qui devient à son tour "bonjour".

Debug.Assert("hello"==RemoveDiacritics("héllo"));

Remarque: en Voici un de plus compact .NET4+ version imprimable de la même fonction:

static string RemoveDiacritics(string text)
{
  return string.Concat( 
      text.Normalize(NormalizationForm.FormD)
      .Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch)!=
                                    UnicodeCategory.NonSpacingMark)
    ).Normalize(NormalizationForm.FormC);
}

127voto

knightpfhor Points 6242

Si vous n’avez pas besoin de convertir la chaîne et vous voulez juste pour vérifier l’égalité, que vous pouvez utiliser des

5voto

Ryan Cook Points 5613

La méthode suivante `` fonctionne sur vos données de l’exemple. Voici l’article où j’ai obtenu mes informations générales : http://www.codeproject.com/KB/cs/EncodingAccents.aspx

Je pense qu’une méthode d’extension serait mieux :

Puis l’utilisation serait le suivant :

3voto

Guish Points 879

J’ai dû faire quelque chose de similaire, mais avec une méthode StartsWith. Voici une solution simple dérivée @Serge - appTranslator.

Voici une méthode d’extension :

Et pour un liners freaks  ;)

Accent incensitive et affaire startsWith incensitive peut être appelée comme ceci

-2voto

Dylan White Points 126

Écrire un normalize(String s) méthode qui prend une chaîne et transforme les lettres accentuées en non accentués un. Alors au lieu de comparer la chaîne de x à y de la chaîne, comparer normalize(string x) pour normaliser (chaîne y).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X