Lösung für GBK zu UTF-8-verstümmeltem Code in Java
Wenn Sie GBK-Kodierung verwenden, erhält die andere Partei UTF-8-Kodierung Beim Senden von Daten müssen Sie die GBK-codierten Daten in UTF-8-codierte Daten konvertieren, damit die andere Partei nicht verstümmelt wird.
Das Problem tritt auf: Bei der Konvertierung von GBK in UTF-8 wird eine ungerade Anzahl chinesischer Schriftzeichen verstümmelt, eine gerade Anzahl chinesischer Schriftzeichen wird jedoch nicht verstümmelt.
Ursachenanalyse:
public static void analyze() throws UnsupportedEncodingException { String gbk = "我来了"; String utf8 = new String(gbk.getBytes("UTF-8")); for (byte b : gbk.getBytes("UTF-8")) { System.out.print(b + " "); } System.out.println(); for (byte b : utf8.getBytes()) { System.out.print(b + " "); } } /* -26 -120 -111 -26 -99 -91 -28 -70 -122 -26 -120 -111 -26 -99 -91 -28 -70 63 ! */
Beachten Sie, dass das letzte Byte unterschiedlich ist, die obige Zeile ist die korrekte UTF-8-Kodierung. Warum ist das letzte Byte in der folgenden Zeile 63 statt -122? Das ist es, was Kauderwelsch verursacht.
Die GBK-Kodierung beträgt auf Chinesisch 2 Bytes, während die UTF-8-Kodierung auf Chinesisch 3 Bytes beträgt. Wenn wir die Methode getBytes("UTF-8") aufrufen, werden die Bytes durch Berechnung hinzugefügt, wobei sich von 2 Bytes in GBK auf 3 Byte entsprechend UTF-8. Daher geben die drei chinesischen Zeichen im obigen Beispiel 9 Bytes aus.
(Weitergabe verwandter Video-Tutorials: Java-Video-Tutorial)
Lösen Sie das Problem
Stellen Sie sicher, dass die Bytes korrekt sind das letzte Wort. Wenn Sie getBytes("UTF-8") zum Konvertieren in ein Byte-Array aufrufen, erstellen Sie eine ISO-8859-1-codierte Zeichenfolge. Die ISO-8859-1-Codierung bedeutet, dass ein Byte einem Zeichen entspricht, sodass das letzte Byte kein Fehler ist .
public static void correctEncode() throws UnsupportedEncodingException { String gbk = "我来了"; String iso = new String(gbk.getBytes("UTF-8"),"ISO-8859-1"); for (byte b : iso.getBytes("ISO-8859-1")) { System.out.print(b + " "); } System.out.println(); //模拟UTF-8编码的网站显示 System.out.println(new String(iso.getBytes("ISO-8859-1"),"UTF-8")); } /* -26 -120 -111 -26 -99 -91 -28 -70 -122 我来了 */
Das obige ist der detaillierte Inhalt vonLösung für verstümmelten GBK-zu-UTF-8-Code in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!