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
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"));//娴嬭瘯 }
/** * 测试编码转换 中文 => 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
Format binari: format pengekodan gbk: gbk
rentetan dikodkan: pelanginew String(str.getBytes("gbk"),"utf8")
Rentetan aksara yang dikodkan: �ʺ�
Format binari: Format pengekodan gbk: gb2312String 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])); } }
Format binari: format pengekodan unikod: gbkRentetan 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: gb2312Rentetan 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?
< . data yang anda ingin pulihkan, maka kemungkinan untuk memulihkan data ini adalah sangat rendah Kerana kecuali untuk "?", watak-watak kacau yang lain sebenarnya mempunyai peraturan pengekodan mereka sendiri Selagi mereka dinyahkodkan secara terbalik dan diikuti dengan betul Ia boleh dipulihkan dengan pengekodan semula format pengekodan bagaimanapun, "?" dikecualikan, kerana apabila strim bait dikompilasi semula mengikut format pengekodan tertentu, bait dalam data bait yang tidak boleh ditukar kepada aksara yang bermakna mengikut format pengekodan akan ditukar kepada "? ", jadi walaupun ia dikodkan secara terbalik ke dalam strim bait, semua "?" akan ditukar kepada bait yang sama, sekali gus kehilangan maknanya sendiri.如果乱码中不包含"?",那么还是有希望转换回去的,我以上述乱码中的 "褰╄櫣" 为例重新进行了一次转换,代码如下:
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])); } }Salin selepas log masuk二进制格式: 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!