c# - 如何比较 "look alike"的 Unicode 字符?

标签 c# .net string unicode string-comparison

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

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

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

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

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

但是,这些可能不是唯一这样的字符。

在C#中有什么方法可以比较看起来相同但实际上不同的字符吗?

最佳答案

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

引用资料:

所以如果你想比较它们并且你需要它们相等,你需要手动处理,或者在比较之前用一个字符替换另一个字符。或者使用以下代码:

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);
}

还有 Demo

关于c# - 如何比较 "look alike"的 Unicode 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20674577/

相关文章:

c# - FormClosing事件中的Application.DoEvents

c# - 查询n :m-Relationships with LINQ

c# - 在 MVC4 中显示 viewbag 列表中的 ListView

c - 字符串和管道中的奇怪行为

javascript - 将文本项转换为 JSON

c# - 如何从 C# 将对象设置为 C++

c# - 如何禁止任务被等待中断?

c# - 为什么这个C#程序会输出这样的结果?怎么理解闭包?

string - 在函数的参数中使用Tmemo的多行

c# - 使用 Web 表单例份验证时如何防止 [Authorize (Roles = "xxx")] 在 openidconnect 中进行验证