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);
}