Heim  >  Artikel  >  Java  >  Lösung für verstümmelten GBK-zu-UTF-8-Code in Java

Lösung für verstümmelten GBK-zu-UTF-8-Code in Java

angryTom
angryTomOriginal
2020-02-10 10:53:478432Durchsuche

Lösung für verstümmelten GBK-zu-UTF-8-Code in Java

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn