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

ここで何が起こっているのかわかりませんが、これらの結果が得られることを誓います。実際には違いは見られず、結果は一貫しています。「false-line」をコピーすると、再びfalseになり、その逆も同様です。

4

4 に答える 4

3

原因は、コードに異なるバージョンの(たとえば)"a"文字が含まれていることであると思われます。たとえば、小文字のLATIN Aは、小文字のCYRILIC Aと同じように見えますが、Unicodeコードポイントが異なるため(\u0061\u0430)、等しくありません。

于 2012-04-28T05:32:10.037 に答える
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

これは、2つの異なる.txtファイルから「2つ」を取得したため、 Joachim Garraudで理解できます。1つ目は最初のファイルの先頭にあり、2つ目は2番目のファイルの途中にあります。ただし、自分でaを入力しましたが、正確に入力したことはもう覚えていません。誤った評価式を使用してコードをコピーして貼り付け、引用符内のJoachimGarraudを削除して入力した可能性があります。 、BOMを削除しませんでした。

とにかく、これから何かを学べることを願っています。また、彼はある種の新しいチャック・ノリスだと思っていましたが、彼はここで無料で(実際にはBOMのために)たくさんの無料広告を受け取りました。ファンでも何でもありません。

于 2012-04-28T14:29:32.717 に答える
2

印刷されたすべての行にすべてのコードをコピーしたときのように、どちらが起こっているのかほとんどわかりませんtrue

したがって、すべてをマシンにコピーして戻すと、すべてが修正されます。

推測しなければならない場合、「a」文字の1つに発音区別符号があり、ディスプレイフォントによってマークのない文字にマッピングされていたと思います。

次回は、16進数の文字列のバイナリコードを出力して比較します。

于 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 に答える