1、ASCII编码
0 - 7F,0000 0000-----0111 1111标准ASCII码
80 - FF 1000 0000 -------1111 1111扩展ASCII码
2、GB2312或GB2312-80(针对自己国家)基于扩展ASCII码
单独看每一个字节,都是扩展ASCII码表中的数据,2个表示一个汉字,这就是GB2312编码,
但是GB2312存在很大的弊端,例:
将一份GB2312编码的邮件发给一个老外的时候,它看到的是乱码,因为不同国家的解释不一样,比如D6 D0 B9 FA在我们国家看到的是”中国”两个汉字,当你发给你个韩国人的时候,它看到的可能是一个韩文
怎么解决问题这个乱码问题呢?UNICODE出现
3、UNICODE
这是一个编码方案,说白了就是一张包含全世界所有文字的一个编码表,只要这个世界上存在的文字符号,统统给你一个唯一的编码:
UNICODE编码范围是: 0 - 0X10FFFF, 可以容纳100多万个符号!
UNICODE 的问题?
假如说:
用多少个字节来存储呢?
UNICODE 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储
4、如何存储UNICODE, UTF-16\UTF-8是UNICODE的实现方式
<1> UTF-16
UTF-16编码以16位无符号整数为单位,注意是16位为一个单位,不表示一个字符就只有16位。这个要看字符的UNICODE编码处于什么范围而定,有可能是2个字节,也有可能是4个字节,现在机器上的UNCODE 编码一般指的就是UTF-16
因为它任何符号都是以2个字节为单位,对于A,B,C这种简单的符号,一个字节就够了,所以用UTF-16可能会浪费空间,在网络传输中效率可能会慢,
<2> UTF-8
比如在记事本中写入 “AB字”,然后分别存储为UTF-16 或 UTF-8的格式
“字” UTF-16 是 5B 57
UTF-8 是 E5 AD 97
因为5B 57在000800 -00FFFF之间,所以按上图第三行的方式解释
E5 AD 97
1110 0101 1010 1101 1001 0111
红色部分拼接为0101 1011 0101 0111,即5B 57
那么给定一个文本,怎么知道是解析为UTF-16还是UTF-8呢?
<3> BOM (Byte Order Mark)(解决解析时候的问题)
UTF-8 || EF BB BF
UTF-16(LE) || FF FE
UTF-16(BE) || FE FF
这是前缀,即怎么解析这个文件是UTF-8还是UTF-16呢??就是通过这个前缀来解决的