首页 >后端开发 >C++ >在忽略重音角色时,如何比较C#中的字符串?

在忽略重音角色时,如何比较C#中的字符串?

Linda Hamilton
Linda Hamilton原创
2025-01-24 16:07:10495浏览

How Can I Compare Strings in C# While Ignoring Accented Characters?

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn