1. 程式人生 > >java編碼,解碼。亂碼原因及解決辦法

java編碼,解碼。亂碼原因及解決辦法

轉換流的編碼,常見的出現亂碼組合

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"));//你好號
		
	}
}