Un problème est survenu: "~" était déformé dans une application WEB créée avec Java. Étant donné que le code de caractère de la base de données était UTF-8 et que la sortie CSV était MS932, c'était une histoire plus simple lorsque j'examinais s'il était brouillé en raison de la conversion de différents codes de caractère. J'ai perdu beaucoup de temps, alors je vais également laisser une note.
Même si la base de données est UTF-8, il n'y a pas de problème ici car c'est UTF16, qui est une représentation interne en Java. Lorsque je suivais le processus, après avoir acquis les données de la base de données, elles ont été converties en SHIFT-JIS par traitement Java, puis converties en MS932. Je pensais que c'était un problème de conversion de SHIFT-JIS, MS932 qui apparaît dans "~", mais c'était un problème de conversion de SHIFT-JIS, UTF16 (représentation interne de Java).
J'ai créé un code source simple et l'ai vérifié. (java: 1.8.0_121) Lorsqu'une chaîne de caractères Java est générée après la conversion en un tableau d'octets de SHIFT-JIS et MS932, seul SHIFT-JIS est déformé.
String org = "~";
byte[] sjBytes = org.getBytes("SHIFT-JIS");
byte[] ms932Bytes = org.getBytes("MS932");
String sj = new String(sjBytes, "SHIFT-JIS");
String ms932 = new String(ms932Bytes, "MS932");
String fmt = "%s\t chaîne:%s,Tableau d'octets:%s";
System.out.println(String.format(fmt, "Caractère original", org, DatatypeConverter.printHexBinary(org.getBytes())));
System.out.println(String.format(fmt, "SHIFT-JIS", sj, DatatypeConverter.printHexBinary(sjBytes)));
System.out.println(String.format(fmt, "MS932", ms932, DatatypeConverter.printHexBinary(ms932Bytes)));
Chaîne d'origine: ~, tableau d'octets: EFBD9E SHIFT-JIS Chaîne de caractères:?, Tableau d'octets: 3F MS932 Chaîne: ~, tableau d'octets: 8160
Il n'y a pas de problème si vous utilisez l'UTF-8 en premier lieu, mais c'est difficile à gérer car les spécifications vont changer. Si vous voulez vraiment utiliser SHIFT-JIS, MS932 suffit, alors n'utilisez pas SHIFT-JIS.
Recommended Posts