18

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

String print = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
String newPrint = thumbprint.Trim().Replace(" ", "").ToUpper();

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

print
"8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"
newPrint
"‎8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"
String.Compare(print, newPrint);
0
print == newPrint
false
print.Equals(newPrint)
false

嗯?为什么他们不相等?

编辑:

我需要使用“指纹”作为基础。这是用户输入的字符串。我只是使用“newPrint”作为临时变量来保存修剪/上限值。print 是预期的结果。

4

3 回答 3

28

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

print.Length
40
newPrint.Length
41
(sbyte)print[0]
56
(sbyte)newPrint[0]
14

Trim这实际上与您的and调用无关,而是与您使用而不是作为基础Replace的事实有关。我只能假设包含那个额外的字符。它来自哪里我不知道。如果你改变你的第二行来代替你会得到你期望的结果。thumbprintprintthumbprintprintthumbprint

于 2012-09-13T13:08:53.910 回答
18

您发布的字符串相等。只需这样做:

string val   = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"; 
string val1  = "‎8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
var bt = System.Text.Encoding.UTF8.GetBytes(val);
var bt_1 = System.Text.Encoding.UTF8.GetBytes(val1);

您将看到第二个数组在开头包含更多元素。

226 
128 
142

在这三个元素内容相等之后。

起作用的原因String.Compare是原因:

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

于 2012-09-13T13:11:44.267 回答
0

这个问题有问题。如果没有,请。指定完整的环境,因为我在 MS .NET 上尝试过,但在 Mono 上没有。试试这个方法: - 我没有错误,跟踪语句的输出是

字符串相等 = True

void TestString()
{
    String print = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
    String newPrint = print.Trim().Replace(" ", "").ToUpper();
    Trace.TraceInformation("Strings are equal = {0}", (print == newPrint) && (print.Equals(newPrint)));
    Debug.Assert(print == newPrint);
    Debug.Assert(print.Equals(newPrint));
}
于 2012-09-13T13:20:02.017 回答