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.
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! !! !! !! *** ***
 (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 ...
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é.
Ne vous inquiétez plus de l'absence d'espace de pause ...