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

Que s'est-il passé pendant ce temps

L'autre jour, je faisais quelque chose comme importer un fichier HTML et changer les caractères.

String str1 = "hoge hoge";
String str2 = anyElement; //Importé depuis un fichier HTML"hoge hoge"

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

Quel faux était sorti. Eh, faux ...? Est-ce un bogue dans String # est égal au début? J'ai pensé, mais je ne pense pas que ce soit le cas. J'ai vérifié diverses choses.

Essayez-le avec char

Ainsi, lorsque j'ai changé les deux chaînes de caractères précédentes en UTF-8 avec String # getBytes, c'est devenu comme suit.

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

Hmm?

-62, -96 ...!?

*** Qu'est-ce que c'est! !! !! !! *** ***

&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) ↑ Il semble que les 2 octets de 0xC2 et 0xA0 soient appelés "aucun espace de pause".

Apparemment, quelque chose comme nbsp sur un fichier HTML n'est pas l'espace de demi-largeur habituel (0x20) en UTF-8 Il semble être représenté par 2 octets de 0xC2 0xA0.

Même s'il est sorti sur la sortie standard, il ne ressemble qu'à un espace demi-largeur. C'est un piège ...

C'est un problème s'il ne s'agit pas d'un espace normal de demi-largeur

Dans ce cas, il peut y avoir un problème lors du traitement de la chaîne de caractères. Ce qui suit est le cas où tous les espaces demi-largeur ne sont pas des espaces de coupure.

String hoge = "a b c".split(" ");
// hoge = ["a b c"]
// ["a", "b", "c"]ce n'est pas...?

String fuga = "a b c".replaceAll(" ", "d");
// fuga = "a b c"
// "adbdc"ce n'est pas...?

C'est un piège ... Cependant, il n'y a aucun problème si vous effectuez les opérations suivantes, par exemple.

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"

ReplaceAll et split prennent tous deux des expressions régulières comme arguments, donc Si vous sélectionnez [(Espace demi-largeur) | (Pas d'espace de coupure)], l'un ou l'autre sera attrapé.

Résumé

Ne vous inquiétez plus de l'absence d'espace de pause ...

Recommended Posts

"hoge hoge" .equals ("hoge hoge") // false
== et égal