我需要在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); }