Bei der normalen Javaweb-Entwicklung kommt es häufig zu einem Problem der Konvertierung verstümmelter chinesischer Zeichen Das Konvertierungsprinzip war mir bisher unklar, deshalb habe ich zum Ausprobieren endlich die Kodierung geklärt und bin zu folgendem Ergebnis gekommen:
utf8 speichert derzeit verschiedene Sprachkodierungen utf8 wird für die Codierung und Decodierung in der Mainstream-Entwicklung verwendet. Die folgenden Situationen führen zu verstümmelten Codes: 1, gbk (Chinesisch), ISO-8859-1 (kein Chinesisch) und andere Codierungsmethoden Zum Dekodieren kann nur die entsprechende Methode verwendet werden, andernfalls führt die Verwendung von utf8 zum Kodieren und Dekodieren mit anderen Methoden zu verstümmelten Zeichen und eine Konvertierung ist erforderlich
3. iso-8859-1) ohne entsprechende Zeichen (Chinesisch) führt zu verstümmelten Codes und kann die Dekodierung nicht wiederherstellen. Das Folgende ist ein Codetest für die obige Situation
utf8-Kodierung – falsche Formdekodierung/** * 测试编码转换 中文 => utf-8 编码 - 解码 */ @Test public void test0() { String test = "测试"; System.out.println(Arrays.toString(test.getBytes(StandardCharsets.UTF_8)));//[-26, -75, -117, -24, -81, -107] System.out.println(new String(test.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8));//测试 }
/** * 测试编码转换 中文 => gbk 编码 - 解码 */ @Test public void test1() throws UnsupportedEncodingException { String test = "测试"; System.out.println(Arrays.toString(test.getBytes("gbk")));//[-78, -30, -54, -44] System.out.println(new String(test.getBytes("gbk"), "GBK"));//测试 }
binäres Format : GBK-Kodierungsformat: Unicode
Kodierte Zeichenfolge: 닊뫧Binärformat: GBK-Kodierungsformat: utf8
Kodierte Zeichenfolge: �ʺ�Binärformat: GBK-Kodierungsformat: gb2312
Kodierte Zeichenfolge: RainbowBinärformat: Unicode-Kodierungsformat: gbk
kodierte Zeichenfolge: �_i唝Binärformat: Unicode-Kodierungsformat: Unicode
kodierte Zeichenfolge: rainbowBinärformat: utf8-Kodierungsformat: gbk
Kodierte Zeichenfolge: 褰╄櫣Binärformat: utf8-Kodierungsformat: utf8
Kodiert Zeichenfolge: rainbowBinärformat: utf8-Kodierungsformat: gb2312Kodierte Zeichenfolge:褰╄��
Binärformat: gb2312 Kodierungsformat: gbk
Kodierte Zeichenfolge: rainbow
Binärformat: gb2312 Kodierungsformat: unicode
Kodierte Zeichenfolge: 닊뫧
Binär Format: gb2312 Kodierungsformat: utf8
kodierte Zeichenfolge: �ʺ�
Binärformat: gb2312 Kodierungsformat: gb2312
Kodierte Zeichenfolge: Rainbow
Es ist ersichtlich, dass das binäre Kodierungsformat und das Kodierungsformat der Zeichenfolge unterschiedlich sind , es treten verstümmelte Zeichen auf.
Warum gibt es bei der Konvertierung von gbk, gb2312 keinen verstümmelten Code? Wenn das binäre Codierungsformat gbk und das Decodierungsformat gb2312 ist, ist es möglich, dass einige chinesische Zeichen verstümmelt sind. Können die verstümmelten Zeichen in den obigen Ergebnissen grob in zwei Typen unterteilt werden? ist eine komplexe Kombination aus chinesischen Schriftzeichen und Grafiken, und das andere ist „?“. Wenn die verstümmelten Daten, die Sie wiederherstellen möchten, Fragezeichen enthalten, ist die Möglichkeit, diese Daten wiederherzustellen, unwahrscheinlich. Denn außer „?“ ", andere verstümmelte Zeichen haben tatsächlich ihre eigenen Codierungsregeln. Solange sie umgekehrt decodiert und befolgt werden, kann das korrekte Codierungsformat durch Neucodierung wiederhergestellt werden. "?" ist jedoch ausgenommen, da der Bytestrom gemäß a neu kompiliert wird Bei bestimmten Codierungsformaten werden die Bytes in den Bytedaten, die gemäß dem Codierungsformat nicht in sinnvolle Zeichen konvertiert werden können, in „?“ konvertiert, sodass auch bei umgekehrter Codierung in einen Bytestrom alle „?“ konvertiert werden in dasselbe Byte und verliert somit seine eigene Bedeutung.如果乱码中不包含"?",那么还是有希望转换回去的,我以上述乱码中的 "褰╄櫣" 为例重新进行了一次转换,代码如下:
String str="褰╄櫣"; String [] charset=new String[] {"gbk","unicode","utf8","gb2312"}; for (int i=0;i<charset.length;i++){ for (int j=0;j<charset.length;j++){ System.out.println("二进制格式: "+charset[i]+"编码格式: "+charset[j]); System.out.println("编码后的字符串: "+new String(str.getBytes(charset[i]),charset[j])); } }二进制格式: gbk编码格式: gbk
编码后的字符串: 褰╄櫣
二进制格式: gbk编码格式: unicode
编码后的字符串: ꧨ馹
二进制格式: gbk编码格式: utf8
编码后的字符串: 彩虹
二进制格式: gbk编码格式: gb2312
编码后的字符串: 褰╄��
二进制格式: unicode编码格式: gbk
编码后的字符串: ��0%Dj�
二进制格式: unicode编码格式: unicode
编码后的字符串: 褰╄櫣
二进制格式: unicode编码格式: utf8
编码后的字符串: ���0%Dj�
二进制格式: unicode编码格式: gb2312
编码后的字符串: ���0%Dj�
二进制格式: utf8编码格式: gbk
编码后的字符串: 瑜扳晞娅�
二进制格式: utf8编码格式: unicode
编码后的字符串: 냢閄�
二进制格式: utf8编码格式: utf8
编码后的字符串: 褰╄櫣
二进制格式: utf8编码格式: gb2312
编码后的字符串: 瑜扳��娅�
二进制格式: gb2312编码格式: gbk
编码后的字符串: 褰╄?
二进制格式: gb2312编码格式: unicode
编码后的字符串: ꧨ�
二进制格式: gb2312编码格式: utf8
编码后的字符串: 彩�?
二进制格式: gb2312编码格式: gb2312
编码后的字符串: 褰╄?可以看到 其中一种转换方式成功的将乱码转变回了正常的中文汉字
二进制格式: gbk编码格式: utf8
编码后的字符串: 彩虹
Das obige ist der detaillierte Inhalt vonWas ist der Java-Codierungskonvertierungsprozess?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!