1、计算机存储规则
计算机中任意数据都是以二进制的形式存储。
1byte = 8bit,字节是计算机中最小的存储单元。
2、字符集
2.1 相关字符集了解
2.2 ASCII字符集
ASCII字符一共有128个。但一个字节最多可表示256个数据,因此存储英文,一个字节就够。
2.3 GBK字符集
GBK中英文字母的存储:
GBK中中文的存储和读取:
注:规则2也是为了中文和英文区分开。
GBK小练习:
2.4 Unicode字符集
编码规则:
UTF-8: 用1~4个字节保存(常用)。
UTF-16: 用2~4个字节保存。
UTF-32: 固定使用4个字节保存。
在UTF-8下不同语言的占用字节数:
Unicode中英文字母的存储:
Unicode中中文字母的存储:
Unicode小练习:
3、字符集总结(重点掌握)
1.在计算机中,任意数据都是以二进制的形式来存储的。
2.计算机中最小的存储单元是一个字节。
3.ASCII字符集中,一个英文占一个字节。
4.简体中文版Windows,默认使用GBK字符集。
5.GBK字符集完全兼容ASCII字符集:
一个英文占一个字节,二进制第一位是0
一个中文占两个字节,二进制高位字节的第一位是1
6、Unicode字符集的UTF-8编码格式
一个英文占一个字节,二进制第一位是0,转成十进制是正数
一个中文占三个字节,二进制第一位是1,第一个字节转成十进制是负数
4、为什么会出现乱码?
在了解了以上字符集后,我们可以得出出现乱码的原因:
- 原因一:读取数据时,未读取到完整的汉字。
- 原因二:编码和解码的方式不统一。
5、解决乱码问题的方法
1、不用字节流读取文本。
2、编码和解码的时候用同一个码表,用同一种编码方式。
问题:
为什么用字节流读取中文时会乱码,使用拷贝时就不会乱码?
因为拷贝的时候是一个字节一个字节拷贝的,没有丢失数据。记事本打开文件时,字符集与数据源字符集一致就不会出现乱码。
6、java中的编码、解码
public static void main(String[] args) throws UnsupportedEncodingException {
/**
* 编码
*/
String str = "ai加b";
//使用IDEA,默认值用UTF-8编码,占6个字节
byte[] byte1 = str.getBytes();
System.out.println(Arrays.toString(byte1));
//指定编码方式GBK,占5个字节
byte[] byte2 = str.getBytes("GBK");
System.out.println(Arrays.toString(byte2));
/**
* 解码
*/
//使用默认解码方式
String string1 = new String(byte1);
System.out.println(string1);
//指定解码方式,若此时使用默认解码方式UTF-8,就会出现乱码,因为byte2的编码方式是GBK
String string2 = new String(byte2,"GBK");
System.out.println(string2);
}