Soyez prudent si vous trouvez SHIFT-JIS en Java

Contexte

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.

Cause

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).

Exemple de conversion de caractères

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)));

Résultat de sortie

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

Résumé

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.

Table des matières

Recommended Posts

Soyez prudent si vous trouvez SHIFT-JIS en Java
Soyez prudent avec la mise à niveau si vous utilisez | etc. dans l'URL Tomcat
Problème de ne pas trouver javax.annotation.Généré en Java 11
Rechercher un sous-ensemble en Java
Essayez une expression If en Java
Utilisez-vous Stream en Java?
Juger si les chaînes de caractères à comparer sont les mêmes en Java
Soyez prudent lorsque vous omettez le retour dans Ruby
Si vous ne pouvez pas installer java sur Catalina
Trouvez le maximum et le minimum des cinq nombres saisis en Java
Ce que les programmeurs Java trouvent utile avec Kotlin
Si vous utilisez DataSourceTransactionManager de Spring, il peut être validé en cas d'erreur! ??
Soyez prudent avec les demandes et les réponses lors de l'utilisation de Serverless Framework avec Java
CORBA semble avoir été supprimé dans Java SE 11. .. ..
[Java] Faites attention au type de clé de la carte
Deuxième décoction: essayez une expression If en Java
Il ne semble pas y avoir d'autre-si en java
Une note quand vous voulez Tuple en Java
[Rubiy] Et si vous mettez chaque déclaration dans chaque déclaration? ??
Dans Java Try-with-Resources, même si vous retournez dans la clause try, elle sera fermée correctement, alors revenons sans nous inquiéter
Partition en Java
Changements dans Java 11
Janken à Java
Taux circonférentiel à Java
FizzBuzz en Java
Omission des crochets du milieu dans l'instruction if (Java Silver)
Après tout, si vous apprenez d'abord, je pense que Java
Ecrire une classe qui peut être ordonnée en Java Un petit mémo standard
N'écrivez pas de code si (isAdmin == true) en Java
Sortie true avec if (a == 1 && a == 2 && a == 3) en Java (identifiant invisible)
Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8
JAWJAW est pratique si vous utilisez WordNet à partir de Java
[Java10] Veillez à utiliser ensemble var et génériques
J'ai essayé de découvrir ce qui avait changé dans Java 9