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

猜你喜欢

转载自blog.csdn.net/weixin_42741866/article/details/82871534