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

时间:2017-01-30 04:47:27

标签: c# string-comparison

我有一个奇怪的情况,我无法弄清楚。

我正在使用第三方转换框架,该框架期望缩写形式的单位,例如“μV”是MicroVolts

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

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

以下是立即窗口的输出,以帮助阐明上下文:

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会给我这样的信息:

enter image description here

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

1 个答案:

答案 0 :(得分:2)

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

  1. Greek small letter mu, U+03BC
  2. Micro sign, U+00B5
  3. 您可以使用\ u escape:

    在字符串中访问它们
    Console.WriteLine("Greek small letter mu: \u03bc");
    Console.WriteLine("Micro sign: \u00b5");