[JAVA] "hoge hoge" .equals ("hoge hoge") // false

Was ist in dieser Zeit passiert?

Neulich habe ich so etwas wie eine HTML-Datei importiert und die Zeichen geändert.

String str1 = "hoge hoge";
String str2 = anyElement; //Aus HTML-Datei importiert"hoge hoge"

System.out.println(str1.equals(str2)); 
// false

Was für ein Fehler wurde ausgegeben. Eh, falsch ...? Ist es ein Fehler in String # gleich gleich? Ich dachte, aber ich glaube nicht, dass das der Fall ist. Ich habe verschiedene Dinge überprüft.

Versuchen Sie es mit char

Als ich die beiden Zeichenfolgen mit String # getBytes in UTF-8 änderte, wurde es wie folgt.

str1 : [104, 111, 103, 101, 32, 104, 111, 103, 101] str2 : [104, 111, 103, 101, -62, -96, 104, 111, 103, 101]

Hmm?

-62, -96 ...!?

*** Was ist das! !! !! !! *** ***

&nbsp(0xC2, 0xA0);

[No Break Space-Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%BC%E3%83%96%E3%83%AC%E3%83%BC % E3% 82% AF% E3% 82% B9% E3% 83% 9A% E3% 83% BC% E3% 82% B9) ↑ Es scheint, dass die 2 Bytes von 0xC2 und 0xA0 als "kein Unterbrechungsraum" bezeichnet werden.

Anscheinend ist so etwas wie nbsp in einer HTML-Datei nicht der übliche Speicherplatz mit halber Breite (0x20) in UTF-8 Es scheint durch 2 Bytes von 0xC2 0xA0 dargestellt zu werden.

Selbst wenn es auf die Standardausgabe ausgegeben wird, sieht es aus wie ein Raum mit halber Breite. Es ist eine Falle ...

Es ist ein Problem, wenn es sich nicht um einen normalen Raum mit halber Breite handelt

In diesem Fall liegt möglicherweise ein Problem bei der Verarbeitung der Zeichenfolge vor. Das Folgende ist der Fall, wenn alle Räume mit halber Breite keine Pausenräume sind.

String hoge = "a b c".split(" ");
// hoge = ["a b c"]
// ["a", "b", "c"]es ist nicht...?

String fuga = "a b c".replaceAll(" ", "d");
// fuga = "a b c"
// "adbdc"es ist nicht...?

Es ist eine Falle ... Es gibt jedoch kein Problem, wenn Sie beispielsweise Folgendes tun.

public static final byte[] NBSP = {(byte)0xC2, (byte)0xA0}; 

String hoge = "a b c".split("[ |" + new String(NBSP) + "]");
// hoge = ["a", "b", "c"]

String fuga = "a b c"
      .replaceAll("[ |" + new String(NBSP) + "]", "d")
// fuga = "adbdc"

Sowohl replaceAll als auch split verwenden reguläre Ausdrücke als Argumente Wenn Sie [(Raum halber Breite) | (Kein Pausenraum)] auswählen, wird einer von beiden abgefangen.

Zusammenfassung

Mach dir keine Sorgen mehr über keinen Pausenraum mehr ...

Recommended Posts

"hoge hoge" .equals ("hoge hoge") // false
== und gleich