如何比较“看起来相似”的 Unicode 字符?

2024-03-18

我陷入了一个令人惊讶的问题。

我在应用程序中加载了一个文本文件,并且有一些逻辑来比较 µ 的值。

我意识到即使文本相同,比较值也是错误的。

 Console.WriteLine("μ".Equals("µ")); // returns false
 Console.WriteLine("µ".Equals("µ")); // return true

在后面的行中,字符 µ 被复制粘贴。

然而,这些可能不是唯一这样的角色。

C#中有没有办法比较看起来相同但实际上不同的字符?


因为它确实是不同的符号,即使它们看起来相同,第一个是实际的字母并且有字符code = 956 (0x3BC)第二个是微标志并且有181 (0xB5).

参考:

  • 符号库 > Unicode字符库 > Unicode区段:希腊语小写字母 MU (U+03BC) http://www.fileformat.info/info/unicode/char/03BC/index.htm
  • Unicode字符集 'MICRO SIGN' (U+00B5) http://www.fileformat.info/info/unicode/char/00B5/index.htm

因此,如果您想比较它们并且需要它们相等,则需要手动处理,或者在比较之前将一个字符替换为另一个字符。或者使用下面的代码:

public void Main()
{
    var s1 = "μ";
    var s2 = "µ";

    Console.WriteLine(s1.Equals(s2));  // false
    Console.WriteLine(RemoveDiacritics(s1).Equals(RemoveDiacritics(s2))); // true 
}

static string RemoveDiacritics(string text) 
{
    var normalizedString = text.Normalize(NormalizationForm.FormKC);
    var stringBuilder = new StringBuilder();

    foreach (var c in normalizedString)
    {
        var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
        if (unicodeCategory != UnicodeCategory.NonSpacingMark)
        {
            stringBuilder.Append(c);
        }
    }

    return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
}

And the Demo http://www.fileformat.info/info/unicode/char/03BC/index.htm

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何比较“看起来相似”的 Unicode 字符? 的相关文章

随机推荐