2

有人可以解释一下这个病态的巫术吗:

    System.out.println(("a".equals("a")));  //true
    System.out.println(("a".equals("а")));  //false

    System.out.println(("Joachim Garraud" == "Joachim Garraud"));       //true
    System.out.println(("Joachim Garraud" == "Joаchim Garraud"));       //false
    System.out.println(("Joachim Garraud".equals("Joаchim Garraud")));  //false
    System.out.println(("Joachim Garraud".equals("Joachim Garraud")));  //true

我不知道这里发生了什么,但我发誓我得到了这些结果。我真的看不出有什么区别,结果是一致的——当我复制“假行”时,我再次得到假,反之亦然。

4

4 回答 4

3

在打印出字符串的二进制代码后(正如 Thomas 和 Old Pro 所建议的那样),最终证明BOM是导致不等式的原因:

for( byte b : "a".getBytes() ) { // The first "a" copied from the false-expression
    System.out.printf("%x ", b);
}
for( byte b : "a".getBytes() ) { // The second "a" copied from the false-expression
    System.out.printf("%x ", b);
}

// Again, copied from the false-evaluating expression:
for( byte b : "Joachim Garraud".getBytes() ) {
    System.out.printf("%x ", b);
}
for( byte b : "Joachim Garraud".getBytes() ) {
    System.out.printf("%x ", b);
}

...导致以下输出:(打印输出对齐以获得更好的可读性)

ef bb bf 61
         61

ef bb bf 4a 6f 61 63 68 69 6d 20 47 61 72 72 61 75 64 
         4a 6f 61 63 68 69 6d 20 47 61 72 72 61 75 64

现在我可以用Joachim Garraud理解这一点,因为我从两个不同的 .txt 文件中获得了这两个“两个”——第一个在第一个文件的开头,第二个在第二个文件的中间。但是,我自己输入了a,但不记得我是如何做到的了——也许我用错误评估表达式复制粘贴了这段代码,然后删除了引号内的Joachim Garraud并输入了 a,它没有删除 BOM。

无论如何,我希望可以从中学到一些东西。此外,这家伙在这里免费获得了很多免费广告(实际上是为了 BOM),尽管我认为他是某种新的 Chuck Norris。不是粉丝什么的。

于 2012-04-28T14:29:32.717 回答
3

我怀疑原因是您的代码包含不同版本的(例如)"a"字符。例如,小写的 LATIN A 可能看起来与小写的 CYRILIC A 相同……但它们是不同的 Unicode 代码点(\u0061\u0430),因此不相等。

于 2012-04-28T05:32:10.037 回答
2

我也不知道发生了什么,因为当我每行都复制了你的所有代码时 print true

因此,将其全部复制回您的机器,一切都应该得到修复。

如果我不得不猜测,我猜其中一个“a”字符有一个变音符号,您的显示字体将其映射到一个没有该标记的字符中。

下次打印出十六进制字符串的二进制代码并进行比较。

于 2012-04-28T05:12:48.533 回答
1

您还应该寻找不可显示的字符。

System.out.println("<\ufff9\ufffa\ufffb>");
System.out.println("<&gt;");
System.out.println("<&gt;".length());
System.out.println(Arrays.toString("<&gt;".toCharArray()));

看起来像这样

<>
<>
5
[<, , , , >]

将其复制到您的 IDE 中,这些字符将不会出现,但它们就在那里。;)

于 2012-04-28T08:11:24.177 回答