字符串平等 - 这里发生了什么?

Eri*_*rix 18 c# string

为了调试我的代码中的问题,我已经声明了以下两个字符串,假设它们是等价的:

String print = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
String newPrint = thumbprint.Trim().Replace(" ", "").ToUpper();
Run Code Online (Sandbox Code Playgroud)

我发现他们不是.太好了,这是我的问题的根源.但是,我正在检查即时窗口中的内容(在声明后面的行)并且不明白发生了什么.这是输出:

print
"8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"
newPrint
"?8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"
String.Compare(print, newPrint);
0
print == newPrint
false
print.Equals(newPrint)
false
Run Code Online (Sandbox Code Playgroud)

是吧?为什么他们不平等?

编辑:

我需要用'thumbprint'作为基础.这是用户输入的字符串.我只是使用'newPrint'作为临时变量来保存修剪/上升值.打印是预期的结果.

Dan*_*rth 28

实际上,它们并不等同.我复制了两个值,newPrint长度为41,而print长度为40.第一个字符newPrint是ASCII值为14.有趣的是,这已经从您的直接窗口转移到SO到我的LINQPad.

print.Length
40
newPrint.Length
41
(sbyte)print[0]
56
(sbyte)newPrint[0]
14
Run Code Online (Sandbox Code Playgroud)

这实际上与你Trim和你的Replace电话无关,但事实上你使用的是thumbprint而不是print作为基础.我只能假设thumbprint包含那个额外的角色.它来自哪里我不知道.如果您要更改第二行print而不是thumbprint您将获得您期望的结果.

  • @Daniel实际上,我刚检查了文档,相关说明是这样的:"字符集包括可忽略的字符.Compare(String,String)方法在执行区分文化的比较时不考虑这些字符.例如,对"动物"与"动物"(使用软连字符或U + 00AD)进行文化敏感的比较表明这两个字符串是等价的......" (6认同)
  • ASCII 14是"SO"字符 - 最初用于选择不同的字符集.不知道为什么它会突然出现在这里...... (3认同)
  • 啊,是的,你实际上可以看到在VS中按2次左/右箭头来移动光标! (2认同)

Tig*_*ran 18

您发布的字符串相等.这样做:

string val   = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"; 
string val1  = "?8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
var bt = System.Text.Encoding.UTF8.GetBytes(val);
var bt_1 = System.Text.Encoding.UTF8.GetBytes(val1);
Run Code Online (Sandbox Code Playgroud)

您将看到第二个数组在开始时包含更多元素.

226 
128 
142
Run Code Online (Sandbox Code Playgroud)

在这3个元素内容相等之后.

原因String.Compare是:

比较使用当前文化来获取特定于文化的信息,例如套管规则和单个字符的字母顺序