Java之IO流读写乱码问题(字符编码)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38225558/article/details/82526218

为什么IO流读写中可能会出现乱码问题??

①编码和解码规则不一致

②这个字符编码不支持某种语言(ex:中文)

那我们应该怎么去尽可能的避免出现乱码的情况呢??

1.编码  : String  --->  byte[]
 String中有对应的方法:
    ①:byte[] getBytes() : 使用平台的默认字符集将此 String 编码为 byte 序列 
    ②:byte[] getBytes(Charset charset) : 使用指定的字符编码来编码字符串
    ③:byte[] getBytes(String charsetName) : 使用指定的字符编码来编码字符串
2.解码  : byte[]  --->  String
 String中有对应的构造方法:
    ①:String(byte[] bytes) : 通过使用平台的默认字符集解码指定的 byte 数组
    ②:String(byte[] bytes, Charset charset) : 使用指定的字符集来解码指定的byte数组
    ③:String(byte[] bytes, String charsetName) : 使用指定的字符集来解码指定的byte数组

字符编码:           ex:有一个字  ==》需要  存储到磁盘  如何进行存储??

常见字符编码:

ASCII编码:用来表示英文,它使用1个字节表示,其中第一位规定为0,其他7位存储数据,一共可以表示128个字符。

0-7数据  : 英文的编码

GBK  ==》 ASCII                ex: 65 ==》A      97 ==》a

拓展ASCII编码:用于表示更多的欧洲文字,用8个位存储数据,一共可以表示256个字符

GBK/GB2312/GB18030:简称国标,表示汉字。GB2312表示简体中文,GBK/GB18030表示繁体中文,其实就是几个不同的版本而已。

Unicode编码:包含世界上所有的字符,是一个字符集。

UTF-8:是Unicode字符的实现方式之一,它使用1-4个字符表示一个符号,根据不同的符号而变化字节长度

ISO8859-1:是单字节编码,向下兼容ASCII,不支持中文

注意:实际web开发  前台网页  后台Java程序  数据库   多个地方都会涉及到字符编码   ==》 因此一定要保持一致


ex:

/**
 * Java之IO流读写乱码问题(字符编码)
 * 1.编码  : String  --->  byte[]
 * String中有对应的方法:
 *   ①:byte[] getBytes() : 使用平台的默认字符集将此 String 编码为 byte 序列 
 *   ②:byte[] getBytes(Charset charset) : 使用指定的字符编码来编码字符串
 *   ③:byte[] getBytes(String charsetName) : 使用指定的字符编码来编码字符串
 * 2.解码  : byte[]  --->  String
 * String中有对应的构造方法:
 *   ①:String(byte[] bytes) : 通过使用平台的默认字符集解码指定的 byte 数组
 *   ②:String(byte[] bytes, Charset charset) : 使用指定的字符集来解码指定的byte数组
 *   ③:String(byte[] bytes, String charsetName) : 使用指定的字符集来解码指定的byte数组
 * @author 郑清
 */
public class Demo {
 
	public static void main(String[] args) throws UnsupportedEncodingException {		
		//eclipse在以GBK语言的情况下测试
		//编码:
		byte[] b = "这个数据是中文!可能会出现乱码".getBytes();
		System.out.println(Arrays.toString(b));
		
		byte[] b2 = "这个数据是中文!可能会出现乱码".getBytes("UTF-8");
		System.out.println(Arrays.toString(b2));
		
		//解码:
		System.out.println(new String(b));
		
		System.out.println(new String(b, "utf-8"));//编码和解码规则不一致 ==》出现乱码问题
		
		System.out.println(new String(b2,"GBK"));//编码和解码规则不一致 ==》出现乱码问题
		
		System.out.println(new String(b2,"utf-8"));//编码和解码规则一致 ==》不会出现乱码问题
	}

}

运行结果图:

猜你喜欢

转载自blog.csdn.net/qq_38225558/article/details/82526218