Rumah  >  Artikel  >  Java  >  Apakah proses penukaran pengekodan java?

Apakah proses penukaran pengekodan java?

PHPz
PHPzke hadapan
2023-04-19 13:10:061668semak imbas

    Penukaran pengekodan dalam java (mengambil utf8 dan gbk sebagai contoh)

    Dalam pembangunan javaweb biasa, keperluan untuk penukaran aksara sering dijumpai, dan akan ada menjadi Cina Saya masih tidak memahami masalah penukaran aksara kepada aksara bercelaru, bagaimana untuk menyelesaikannya dan prinsip penukaran, jadi saya menulis kod ujian untuk mencubanya, dan akhirnya menjelaskan pengekodan itu . Ringkasannya adalah seperti berikut:

    Disimpan dalam utf8 Terdapat pelbagai pengekodan bahasa Pada masa ini, utf8 digunakan untuk pengekodan dan penyahkodan dalam pembangunan arus perdana :

    • 1. gbk (Bahasa Cina), Jika anda menggunakan iso-8859-1 (tiada bahasa Cina) atau kaedah pengekodan lain, anda hanya boleh menggunakan kaedah yang sepadan untuk menyahkod, jika tidak, ia akan menjadi kacau bilau

    • 2 Gunakan utf8 untuk pengekodan dan kaedah lain untuk penyahkodan dan memerlukan penukaran

    • 3 menggunakan set aksara (iso-8859-1) tanpa aksara yang sepadan (Bahasa Cina) akan menyebabkan kod bercelaru dan penyahkodan tidak boleh dipulihkan

    Berikut ialah ujian kod untuk situasi di atas

    3. Tiada pengekodan aksara yang sepadan
    /**
     * 测试编码转换 中文 => 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"));//测试
    }

    Dalam kes ini, walaupun kaedah pengekodan asal digunakan untuk penyahkodan, aksara tidak boleh dipulihkan, iaitu keadaan Tidak Boleh Balik

    /**
     * 测试编码转换 中文 => utf-8 编码- gbk解码
     */
    @Test
    public void test2() throws UnsupportedEncodingException {
        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), "gbk"));//娴嬭瘯
    }
    Penukaran format pengekodan Java dan pemulihan bercelaru

    Cara melakukan penukaran format pengekodan dalam java
    /**
     * 测试编码转换 中文 => utf-8 编码 - gbk 解码 ===> gbk 编码 - utf-8解码
     * "测试" => (utf8-encode)[-26, -75, -117, -24, -81, -107] => (gbk-decode)娴嬭瘯
     * "娴嬭瘯" => (utf8-encode)[-26, -75, -117, -24, -81, -107] => (utf8-decode)"测试"
     */
    @Test
    public void test3() throws UnsupportedEncodingException {
        String test = "测试";
        String test_gbk_utf8 = new String(test.getBytes(StandardCharsets.UTF_8), "gbk");
        System.out.println(test_gbk_utf8);//娴嬭瘯
        String test_utf8_gbk = new String(test_gbk_utf8.getBytes("gbk"), StandardCharsets.UTF_8);
        System.out.println(test_utf8_gbk);//测试
    
    }

    Maksud baris kod berikut ialah: Dapatkan rentetan sasaran str Kod binari dalam pengekodan gbk format, dan kemudian kod semula kod binari ke dalam rentetan mengikut format pengekodan utf8 Sudah tentu, kaedah penulisan berikut akan menjadi kacau 100% kerana format pengekodan tidak konsisten

    @Test
        public void test4() throws UnsupportedEncodingException {
            String test = "测试";
            System.out.println(Arrays.toString(test.getBytes(StandardCharsets.ISO_8859_1)));//[63, 63]
            System.out.println(new String(test.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.ISO_8859_1));//??
        }

    Apa itu perkara pertama? Situasi akan menjadi kacau bilau

    Jika anda ingin menghantar rentetan, anda mesti menukar rentetan itu menjadi strim bait mengikut format pengekodan tertentu Apabila strim bait dihantar ke penerima, strim bait mesti ditukar kepada strim bait mengikut format pengekodan tertentu Format pengekodan ditukar kepada rentetan aksara bercelaru juga dijana semasa proses penukaran semula kepada rentetan aksara:

    Format binari: format pengekodan gbk: gbk

    rentetan dikodkan: pelangi
    new String(str.getBytes("gbk"),"utf8")
    format binari: format pengekodan gbk: unikod

    rentetan berkod: 닊뫧

    format binari: format pengekodan gbk: utf8

    Rentetan aksara yang dikodkan: �ʺ�

    Format binari: Format pengekodan gbk: gb2312
      String str="彩虹";
            String [] a=new String[] {"gbk","unicode","utf8","gb2312"};
            for (int i=0;i<a.length;i++){
                for (int j=0;j<a.length;j++){
                    System.out.println("二进制格式:   "+a[i]+"编码格式:  "+a[j]);
                    System.out.println("编码后的字符串:  "+new String(str.getBytes(a[i]),a[j]));
     
                }
            }
    Rentetan yang dikodkan: pelangi
    Format binari: format pengekodan unikod: gbk

    Rentetan berkod: �_i唝
    Format binari: format pengekodan unikod: unikod
    Rentetan dikod: pelangi
    Format binari: format pengekodan unikod: utf8
    Rentetan dikodkan: ��_i�y
    Perduaan format : format pengekodan unicode: gb2312
    rentetan dikodkan: ��_i�y
    format binari: format pengekodan utf8: gbk
    rentetan dikodkan: 褰╄櫣
    format binari: utf8 Format pengekodan: unicode
    Rentetan yang dikodkan: ꧨ馹
    Format binari: Format pengekodan utf8: utf8
    Rentetan yang dikodkan: Rainbow
    Format binari: Format pengekodan utf8: gb2312
    Rentetan yang dikodkan: pelangi
    Format binari: gb2312 format pengekodan: unicode
    Rentetan aksara yang dikodkan: 닊뫧
    Format binari: gb2318>format rentetan yang dikodkan🎜 | aksara akan berlaku.

    Mengapa tiada kod bercelaru dalam penukaran gbk dan gb2312?

    Antara gbk dan gb2312 Tiada kod bercelaru dalam penukaran kerana gbk ialah versi gb2312 yang dipertingkat dan menyokong lebih banyak pengekodan aksara Cina. Oleh itu, jika format pengekodan binari ialah gbk dan format penyahkodan ialah gb2312, dalam kes ini, beberapa aksara Cina mungkin bercelaru

    Bolehkah data yang rosak itu ditukar kembali?

    如果乱码中不包含"?",那么还是有希望转换回去的,我以上述乱码中的 "褰╄櫣" 为例重新进行了一次转换,代码如下:

           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
    编码后的字符串:  彩虹

    Atas ialah kandungan terperinci Apakah proses penukaran pengekodan java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam