EDIT 2012-01-20: Oh garçon! La solution était tellement plus simple et a été dans le cadre presque pour toujours. Comme l'a souligné knightpfhor :
string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
Voici une fonction qui supprime les signes diacritiques 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 le blog de MichKap ( RIP ... ).
Le principe est qu'il transforme 'é' en 2 caractères successifs 'e', aigus. Il parcourt ensuite les caractères et ignore les signes diacritiques.
"héllo" devient "il <acute> llo", qui à son tour devient "bonjour".
Debug.Assert("hello"==RemoveDiacritics("héllo"));
Remarque: Voici une version plus compacte et conviviale .NET4 + 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);
}
string.Normalize
?Si vous n'avez pas besoin de convertir la chaîne et que vous souhaitez simplement vérifier l'égalité, vous pouvez utiliser
ou si vous voulez que la comparaison soit également insensible à la casse
la source
La méthode suivante
CompareIgnoreAccents(...)
fonctionne sur vos données d'exemple. Voici l'article où j'ai obtenu mes informations générales: http://www.codeproject.com/KB/cs/EncodingAccents.aspxJe pense qu'une méthode d'extension serait meilleure:
Alors l'utilisation serait la suivante:
la source
J'ai dû faire quelque chose de similaire mais avec une méthode StartsWith. Voici une solution simple dérivée de @Serge - appTranslator.
Voici une méthode d'extension:
Et pour l'un des freaks des doublures;)
Accent incensible et casse départ insensibles avec peut être appelé comme ça
la source
Un moyen plus simple de supprimer les accents:
la source
essayez cette surcharge sur la méthode String.Compare.
String.Compare, méthode (String, String, Boolean, CultureInfo)
Il produit une valeur int basée sur les opérations de comparaison, y compris cultureinfo. l'exemple de la page compare "Change" en en-US et en-CZ. CH en en-CZ est une seule "lettre".
exemple du lien
par conséquent, pour les langues accentuées, vous devrez obtenir la culture, puis tester les chaînes en fonction de cela.
http://msdn.microsoft.com/en-us/library/hyxc48dt.aspx
la source