РЕДАКТИРОВАТЬ 2012-01-20: О, мальчик! Решение было намного проще и оставалось в рамках почти навсегда. Как указывает knightpfhor :
string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
Вот функция, которая удаляет диакритические знаки из строки:
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);
}
Подробнее в блоге MichKap ( RIP ... ).
Принцип состоит в том, что он превращает «é» в два последовательных символа «е» с ударением. Затем он перебирает символы и пропускает диакритические знаки.
«héllo» становится «he <acute> llo», которое, в свою очередь, становится «hello».
Debug.Assert("hello"==RemoveDiacritics("héllo"));
Примечание. Вот более компактная версия той же функции, совместимая с .NET4 +:
static string RemoveDiacritics(string text)
{
return string.Concat(
text.Normalize(NormalizationForm.FormD)
.Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch)!=
UnicodeCategory.NonSpacingMark)
).Normalize(NormalizationForm.FormC);
}
string.Normalize
?