为什么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"));//编码和解码规则一致 ==》不会出现乱码问题
}
}
运行结果图: