Seien Sie vorsichtig, wenn Sie SHIFT-JIS in Java finden

Hintergrund

Es gab ein Problem, dass "~" in einer mit Java erstellten WEB-Anwendung verstümmelt war. Da der DB-Zeichencode UTF-8 und die CSV-Ausgabe MS932 war, war es eine einfachere Geschichte, als ich untersuchte, ob er aufgrund der Konvertierung verschiedener Zeichencodes verstümmelt war. Ich habe viel Zeit verschwendet, also werde ich auch eine Nachricht hinterlassen.

Ursache

Selbst wenn die Datenbank UTF-8 ist, gibt es hier kein Problem, da es sich um UTF16 handelt, eine interne Darstellung in Java. Als ich den Prozess verfolgte, wurden die Daten nach dem Erfassen aus der Datenbank durch Java-Verarbeitung in SHIFT-JIS konvertiert und dann in MS932 konvertiert. Ich dachte, es sei ein Konvertierungsproblem von SHIFT-JIS, MS932, das in "~" erscheint, aber es war ein Konvertierungsproblem von SHIFT-JIS, UTF16 (interne Darstellung von Java).

Beispiel für die Zeichenkonvertierung

Ich habe einen einfachen Quellcode erstellt und überprüft. (Java: 1.8.0_121) Wenn nach der Konvertierung in ein Byte-Array von SHIFT-JIS und MS932 eine Java-Zeichenfolge generiert wird, wird nur SHIFT-JIS verstümmelt.

        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 string:%s,Byte-Array:%s";
        System.out.println(String.format(fmt, "Ursprünglicher Charakter", 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)));

Ausgabeergebnis

Ursprüngliche Zeichenfolge: ~, Byte-Array: EFBD9E SHIFT-JIS Zeichenfolge:?, Byte-Array: 3F MS932 String: ~, Byte-Array: 8160

Zusammenfassung

Es gibt kein Problem, wenn Sie UTF-8 verwenden, aber es ist schwierig zu handhaben, da sich die Spezifikationen ändern. Wenn Sie SHIFT-JIS wirklich verwenden möchten, reicht MS932 aus. Verwenden Sie daher SHIFT-JIS nicht.

Inhaltsverzeichnis

Recommended Posts

Seien Sie vorsichtig, wenn Sie SHIFT-JIS in Java finden
Seien Sie beim Upgrade vorsichtig, wenn Sie | usw. in der Tomcat-URL verwenden
Problem beim Finden von javax.annotation.Generated in Java 11 nicht
Suchen Sie eine Teilmenge in Java
Versuchen Sie einen If-Ausdruck in Java
Verwenden Sie Stream in Java?
Beurteilen Sie, ob die zu vergleichenden Zeichenfolgen in Java identisch sind
Seien Sie vorsichtig, wenn Sie die Rückkehr in Ruby weglassen
Wenn Sie Java nicht auf Catalina installieren können
Finden Sie das Maximum und Minimum der fünf in Java eingegebenen Zahlen
Was Java-Programmierer mit Kotlin nützlich finden
Wenn Sie den DataSourceTransactionManager von Spring verwenden, kann dieser im Fehlerfall festgeschrieben werden! ??
Seien Sie vorsichtig mit Anfragen und Antworten, wenn Sie das Serverless Framework mit Java verwenden
CORBA scheint in Java SE 11 entfernt zu sein. .. ..
[Java] Achten Sie auf den Schlüsseltyp der Karte
Zweite Abkochung: Versuchen Sie einen If-Ausdruck in Java
Es scheint kein anderes zu geben - wenn in Java
Ein Hinweis, wenn Sie Tupel in Java möchten
[Rubiy] Was ist, wenn Sie jede Aussage in jede Aussage einfügen? ??
Selbst wenn Sie in Java Try-with-Resources in der try-Klausel zurückkehren, wird diese ordnungsgemäß geschlossen. Kehren wir also ohne Bedenken zurück
Partisierung in Java
Änderungen in Java 11
Janken in Java
Umfangsrate in Java
FizzBuzz in Java
Weglassen der mittleren Klammern in der if-Anweisung (Java Silver)
Wenn Sie zuerst lernen, denke ich schließlich Java
Schreiben einer Klasse, die in Java bestellt werden kann Ein kleines Standard-Memo
Schreiben Sie keinen Code, wenn (isAdmin == true) in Java
Ausgabe true mit if (a == 1 && a == 2 && a == 3) in Java (Invisible Identifier)
Wenn Sie Annotation in Java 8 dynamisch ersetzen möchten
JAWJAW ist praktisch, wenn Sie WordNet aus Java verwenden
[Java10] Achten Sie darauf, var und generics nicht zusammen zu verwenden
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat