欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java编码,解码。乱码原因及解决办法

程序员文章站 2024-03-13 09:56:51
...

转换流的编码,常见的出现乱码组合

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