在 C# 中比较字符串时忽略重音字符
在 C# 中,处理带重音字符的字符串比较可能会比较棘手。考虑以下示例:
<code class="language-csharp">string s1 = "hello"; string s2 = "héllo"; s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase); s1.Equals(s2, StringComparison.OrdinalIgnoreCase);</code>
这两个字符串应该相等,但这两个语句都返回 false。这是因为字母上的重音被视为不同的字符。为了解决这个问题,我们可以在比较字符串之前采用一种去除附加符号(或重音)的技术。
去除附加符号
以下是一种从字符串中去除附加符号的方法:
<code class="language-csharp">static string RemoveDiacritics(string text) { // 将字符串规范化为 Unicode 规范化形式 D string formD = text.Normalize(NormalizationForm.FormD); // 创建一个 StringBuilder 来保存结果字符串 StringBuilder sb = new StringBuilder(); // 迭代规范化字符串中的字符 foreach (char ch in formD) { // 检查字符是否不是非间隔标记 UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(ch); if (uc != UnicodeCategory.NonSpacingMark) { // 将字符附加到 StringBuilder sb.Append(ch); } } // 将 StringBuilder 转换为字符串并将其规范化为 Unicode 规范化形式 C return sb.ToString().Normalize(NormalizationForm.FormC); }</code>
此方法首先将字符串规范化为 D 形式,这会将带重音的字符拆分为多个字符。然后,它迭代这些字符并过滤掉非间隔标记(即重音)。最后,它重新组合剩余的字符以形成一个不带重音的字符串。
要使用此方法,只需在比较它们之前将其应用于两个字符串。例如:
<code class="language-csharp">string s1 = "hello"; string s2 = "héllo"; s1.Equals(RemoveDiacritics(s2), StringComparison.InvariantCultureIgnoreCase); // True</code>
这将正确地评估为 true,认为“héllo”中的重音“e”等效于“hello”中的非重音“e”。
以上是在忽略重音角色时,如何比较C#中的字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!