C# 两个字符串,在视觉上相同,但它们既不相等也不等价

C# Two strings, visually the same, yet they are not Equal nor Equivalent

我有个奇怪的情况想不通。

我正在使用第三方转换框架,它需要缩写形式的单位,例如"μV" 即微伏

但是当我将字符串“μV”解析为 MicroVolts 时,它失败了。

我将其归结为我传入的缩写字符串不等于第三方框架用于 Microvolts 的字符串,即使它们看起来相同。

这是即时 window 的输出,以帮助阐明上下文:

targetUom
"µV"
targetUom.GetHashCode()
-837503221
"μV".GetHashCode()
-837502956
targetUom.Equals("µV") // This is using the value of targetUom
true
targetUom.Equals("μV") // This is using the value from the 3rd party framework
false

我通过调试和复制我知道他们用于 MicroVolts 的缩写值获得了第三方框架中使用的值。

知道为什么两个字符串,即使看起来由完全相同的字符组成,也不会被视为相等吗?

我还比较了两个字符串之间的第一个字符,即微单位表示:

'μ'.CompareTo(targetUom[0])
775

*********** 更新 **************** 所以我发现这两个微字符是不同的编码。

但是当我尝试使用目标框架使用的相同编码时,Visual Studio 给我这个消息:

更改文件编码的含义是什么。我应该这样做还是应该与框架作者合作以使他们的框架能够处理这两种编码?

原来有两个 unicode 字符在大多数字体中可能是相同的:

  1. Greek small letter mu, U+03BC
  2. Micro sign, U+00B5

您可以使用 \u 转义符在字符串中访问它们:

Console.WriteLine("Greek small letter mu: \u03bc");
Console.WriteLine("Micro sign: \u00b5");