EDIT 2012-01-20: おいおい!ソリューションは非常にシンプルで、ほぼ永久にフレームワークに含まれていました。ナイトプフォーが指摘したように:
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... ) を参照してください。
原則は、'é' を 2 つの連続する文字 'e'、鋭角に変えることです。次に、文字を繰り返し処理し、分音記号をスキップします。
"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);
}