一尘不染

字符串比较中忽略重音字母

c#

我需要在C#中比较2个字符串,并将重音字母与非重音字母相同。例如:

string s1 = "hello";
string s2 = "héllo";

s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase);
s1.Equals(s2, StringComparison.OrdinalIgnoreCase);

这两个字符串必须相同(就我的应用程序而言),但是这两个语句的评估结果均为false。C#中有办法做到这一点吗?


阅读 351

收藏
2020-05-19

共1个答案

一尘不染

编辑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
)的更多详细信息。

原理是将’é’转换为2个连续的字符’e’,即尖峰。然后,它遍历字符并跳过变音符号。

“héllo”变成“ he 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);
}
2020-05-19