Heim  >  Artikel  >  Java  >  Was ist der Java-Codierungskonvertierungsprozess?

Was ist der Java-Codierungskonvertierungsprozess?

PHPz
PHPznach vorne
2023-04-19 13:10:061713Durchsuche

    Codierungskonvertierung in Java (am Beispiel von utf8 und gbk)

    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));//测试
      }
    • Der richtige Weg besteht darin, die falsche Dekodierungsform (gbk) als Transit zu drücken, sie entsprechend der falschen Form (gbk) neu zu kodieren (utf8-kodiert) und dann utf8 zu verwenden Führen Sie eine korrekte Dekodierung (utf8-dekodierung) durch, um die ursprünglichen Zeichen zu erhalten ein irreversibler Zustand.

      Konvertierung des Java-Codierungsformats und Wiederherstellung von verstümmeltem Code
    • So führen Sie die Konvertierung des Codierungsformats in Java durch

      Die Bedeutung der folgenden Codezeile lautet: Holen Sie sich den Binärcode der Zielzeichenfolge str im GBK-Codierungsformat , und kodieren Sie dann den Binärcode gemäß dem utf8-Kodierungsformat neu. Natürlich ist die folgende Schreibmethode zu 100 % verstümmelt, da das Kodierungsformat inkonsistent ist verstümmelt sein? Wenn Sie eine Zeichenfolge übertragen möchten, müssen Sie die Zeichenfolge zunächst gemäß einem bestimmten Codierungsformat in einen Byte-Stream konvertieren. Bei der Rückkonvertierung in eine Zeichenfolge werden auch verstümmelte Zeichen erzeugt. Das Folgende ist mein Test für verstümmelte chinesische Zeichen:
    • /**
       * 测试编码转换 中文 => 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ärformat: gbk-Kodierungsformat: gbk

    Kodierte Zeichenfolge: Rainbow

    binäres Format : GBK-Kodierungsformat: Unicode

    Kodierte Zeichenfolge: 닊뫧

    Binärformat: GBK-Kodierungsformat: utf8

    Kodierte Zeichenfolge: �ʺ�

    Binärformat: GBK-Kodierungsformat: gb2312

    Kodierte Zeichenfolge: Rainbow

    Binärformat: Unicode-Kodierungsformat: gbk

    kodierte Zeichenfolge: �_i唝

    Binärformat: Unicode-Kodierungsformat: Unicode

    kodierte Zeichenfolge: rainbow

    Binärformat: Unicode-Kodierungsformat: utf8

    kodierte Zeichenfolge: ��_i�y

    Binärformat: Unicode-Kodierungsformat: gb2312

    Kodiert Zeichenfolge: ��_i�y

    Binärformat: utf8-Kodierungsformat: gbk

    Kodierte Zeichenfolge: 褰╄櫣

    binäres Format: utf8-Kodierungsformat: Unicode

    Kodierte Zeichenfolge: ꧨ馹

    Binärformat: utf8-Kodierungsformat: utf8

    Kodiert Zeichenfolge: rainbow
    Binärformat: utf8-Kodierungsformat: gb2312

    Kodierte 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!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen