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

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

string s1 = "hello";

string s2 = "héllo";

s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase);

s1.Equals(s2, StringComparison.OrdinalIgnoreCase);

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

回答:

编辑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);

}

以上是 字符串比较中忽略重音字母 的全部内容, 来源链接: utcz.com/qa/399227.html

回到顶部