java編碼,解碼。亂碼原因及解決辦法
阿新 • • 發佈:2018-11-27
轉換流的編碼,常見的出現亂碼組合
package com.qianfeng.test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; /* * 轉換流的編碼: * 常用字符集: * 中國的:GBK/GB2312--------2個位元組 * 歐洲的:ISO8859-1-----不支援中文,但是一個漢字對應1個位元組 * 國標:UTF-8----3個位元組 * 內部編碼:unicode----2個位元組 * 美國的:ASCII * * 編碼:由字串轉成byte的過程 * 解碼:由byte轉成字串的過程 * 亂碼:在編碼與解碼的過程中,使用了不同的字符集,造成編碼錯誤.出現了亂碼. * * 常見的出現亂碼的組合: * 使用GBK編碼 ISO8859-1解碼 或者 UTF8編碼 ISO8859-1解碼 * * 舉例:使用GBK編碼 UTF8解碼 或者 UTF8編碼 GBK解碼說明轉換流的編碼問題 */ public class Demo2 { public static void main(String[] args) throws IOException { //寫的時候採用utf-8編碼 writeData1(); readData1();//使用utf-8字符集 readData2();//使用GBK字符集 //寫的時候採用GBK編碼 writeData2(); readData3();//使用utf-8字符集 readData4();//使用GBK字符集 } //寫出 //編碼格式是utf8 public static void writeData1() throws IOException { //建立輸出流並關聯檔案 第一個引數是位元組輸出流 第二個引數是:輸出時指定的編碼格式 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("utf8.txt"),"utf-8"); outputStreamWriter.write("冰冰"); outputStreamWriter.close(); } //寫出 //編碼格式是GBK public static void writeData2() throws IOException { //建立輸出流並關聯檔案 第一個引數是位元組輸出流 第二個引數是:輸出時指定的編碼格式 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("GBK.txt"),"GBK");//預設GBK outputStreamWriter.write("冰冰"); outputStreamWriter.close(); } //讀入 //編碼格式是utf8 public static void readData1() throws IOException { InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("utf8.txt"),"utf-8"); char[] arr = new char[100]; int num = inputStreamReader.read(arr); System.out.println("readData1:"+new String(arr,0,num)); inputStreamReader.close(); } //讀入 //編碼格式是GBK public static void readData2() throws IOException { InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("utf8.txt"),"GBK");//預設utf8 char[] arr = new char[100]; int num = inputStreamReader.read(arr); System.out.println("readData2:"+new String(arr,0,num)); inputStreamReader.close(); } //讀入 //編碼格式是utf8 public static void readData3() throws IOException { InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("GBK.txt"),"utf-8"); char[] arr = new char[100]; int num = inputStreamReader.read(arr); System.out.println(new String(arr,0,num)); inputStreamReader.close(); } //讀入 //編碼格式是utf8 public static void readData4() throws IOException { InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("GBK.txt"),"GBK");//預設GBK char[] arr = new char[100]; int num = inputStreamReader.read(arr); System.out.println(new String(arr,0,num)); inputStreamReader.close(); } }
研發中的編碼
package com.qianfeng.test; import java.io.UnsupportedEncodingException; import java.util.Arrays; /* * 研發中的編碼: * * * 說明:GBK,UTF-8是支援中文的,ISO8859-1不支援中文 * * * 編碼: * byte[] getBytes() //對於中文 預設的格式 使用平臺的預設字符集將此 String 編碼為 byte 序列, 並將結果儲存到一個新的 byte 陣列中。 byte[] getBytes(Charset charset) 使用給定的 charset 將此 String 編碼到 byte 序列,並將結果儲存到新的 byte 陣列。 解碼: String(byte[] bytes) //對於中文 預設是格式 通過使用平臺的預設字符集解碼指定的 byte 陣列,構造一個新的 String。 String(byte[] bytes, Charset charset) 通過使用指定的 charset 解碼指定的 byte 陣列,構造一個新的 String。 * */ public class Demo3 { public static void main(String[] args) throws UnsupportedEncodingException { //使用GBK編碼解碼 String s1 = "你好"; byte[] bs1 = s1.getBytes("GBK");//編碼 System.out.println(new String(bs1,"GBK"));//解碼 System.out.println(Arrays.toString(bs1));//[-60, -29, -70, -61] //使用utf8編碼解碼 String s2 = "你好"; byte[] bs2 = s2.getBytes("utf-8");//編碼 System.out.println(new String(bs2,"utf-8"));//解碼 System.out.println(Arrays.toString(bs2));//[-28, -67, -96, -27, -91, -67] //使用ISO8859-1編碼解碼 String s3 = "你好"; byte[] bs3 = s3.getBytes("ISO8859-1");//編碼 System.out.println(new String(bs3,"ISO8859-1"));//解碼 System.out.println(Arrays.toString(bs3));//[63, 63] } }
亂碼問題的解決辦法
package com.qianfeng.test; import java.io.UnsupportedEncodingException; /* * 解決亂碼: * 出現的情況:編碼與解碼字符集不一致 * 解決辦法:通過再編碼再解碼解決亂碼,但是是在保證第一次編碼沒有問題的前提下. * *是否可以採用再編碼再解碼處理: * 編碼 解碼 * GBK UTF8 不可以 * GBK ISO8859-1 可以 * UTF8 GBK 不可以 * UTF8 ISO8859-1 可以 * ISO8859-1 GBK 不可以(編碼就出錯了) * ISO8859-1 UTF-8 不可以(編碼就出錯了) */ public class Demo4 { public static void main(String[] args) throws UnsupportedEncodingException { //1.GBK編碼 UTF-8解碼 // String s1 = "你好"; // byte[] bs1 = s1.getBytes("GBK"); // String strbs1 = new String(bs1, "utf-8"); // System.out.println("utf8解碼:"+strbs1);//utf8解碼:��� // // //再編碼 // byte[] bs11 = strbs1.getBytes("utf-8"); // //再解碼 // System.out.println(new String(bs11,"GBK"));//錕斤拷錕� //2.GBK編碼 ISO8859-1解碼 // String s1 = "你好"; // byte[] s1b = s1.getBytes("GBK"); // String sr1b = new String(s1b,"ISO8859-1"); // System.out.println("ISO8859-1解碼:"+sr1b);//???? // // //再編碼 // byte[] s1bb = sr1b.getBytes("ISO8859-1"); // //再解碼 // System.out.println("GBK再編碼:"+new String(s1bb,"GBK"));//你好 //3.utf8編碼 GBK解碼 String s1 = "你好啊"; byte[] s1b = s1.getBytes("utf-8"); String sr1b = new String(s1b,"GBK"); System.out.println("GBK解碼:"+sr1b);//浣犲ソ鍙? //再編碼 byte[] s1bb = sr1b.getBytes("GBK"); //再解碼 System.out.println("utf8再編碼:"+new String(s1bb,"utf-8"));//你好?? //4.utf8編碼 ISO8859-1解碼 // String s1 = "你好號"; // byte[] s1b = s1.getBytes("utf-8"); // String sr1b = new String(s1b,"ISO8859-1"); // System.out.println("ISO8859-1解碼:"+sr1b);//????????· // // //再編碼 // byte[] s1bb = sr1b.getBytes("ISO8859-1"); // //再解碼 // System.out.println("utf8再編碼:"+new String(s1bb,"utf-8"));//你好號 } }