字符串比较中忽略重音字母
我需要在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