各类编码之间的关系
面试遇到的问题,发现我对编码字符集还没系统总结过,今天来学习一下
主要是ASCII、UTF-8、Unicode、gkb等
ASCII
1.American Standard Code for Information Interchange,美国信息交换标注码
2.ASCII字符集是单字节存储,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。
前面0-127是表示固定的英语字符,后面128-255段由其他欧洲国家的字母填充。
Unicode
1.Unicode 为每种语言中的每个字符设定了统一且唯一的二进制编码,将全世界的常用文字都囊括进去,以满足跨语言跨平台进行文本转换和处理的需求。
2.Unicode 将世界上所有的文字用2个字节统一进行编码。现在用的是UCS-2,即2个字节编码,后续拓展所以出现UCS-4, 即4个字节编码,由原先的65536个编码扩展至将近100万编码。
UTF-8
1.UTF-8是Unicode的其中一个使用方式。UTF是 Unicode Tranformation Format,即把Unicode转做某种格式的意思。
使用可变长度字节来储存Unicode字符,使得双字节的Unicode能够在现存的处理单字节的系统上正确传输。
2.utf-8编码规则
如果第一个字节的最高位是0,那么表示占一个字节
如果第一个字节(leading byte)的最高三位是110,那么表示这个字符占2个字节(前面1的个数),第二个字节的最高2位是10
如果第一个字节(leading byte)的最高三位是1110,那么表示这个字符占3个字节,第2和第3个字节的最高2位是10
原理同上,只是第一个字节(leading byte)的最高三位是11110
以此类推,后面蓝色的位置,从后往前填字符在unicode编码下的二进制数,多余的位补0,具体如下
GB2312
1.当计算机引入国内时,编码仅支持英文字母,无法输入中文,因此制定了最早的中文编码集GB2312,全称叫做《信息交换用汉字编码字符集》,它是国家标准总局1980年发布的。
2.中文可以用两个字节表示嘛,一个字节8位。两个字节就是16位,能表示的最大范围是2的15次方,十进制就是32768,能表示3万多汉字呢,这样一来,我们就解决了计算机表示中文的问题。
(GB2312兼容ASCII码)
GBK
1.GB2312编码表是真的不够用啊,随着计算机在各行业内的应用,汉字不够用的窘迫也日益突出,最终在1995年12月1日制定了GBK编码,全称《汉字内码扩展规范》。它在GB2312的基础上收录了21003个汉字。
2.因此,GBK编码是包含GB2312的,当我们需要指明解码方式时,完全可以使用GBK代替GB2312,也就是说我们可以忘掉GB2312了。
带BOM的UTF-8
在Windows系统上,许多Windows程序(包括Windows记事本在内)在保存为UTF-8时,会在文档的开头添加字节0xEF,0xBB,0xBF,这是Unicode字节顺序标记,通常称为UTF-8 BOM。注意,Unicode标准既不要求也不建议使用BOM,说白了这就是Windows系统埋下的坑!如果你在Windows系统上保存了UTF-8 带BOM的文档,那么在Linux或Mac OS上可能会无法正确识别。因此,非常不建议使用Windows自带的记事本去编辑源代码,甚至其他文本文件也最好不要用它编辑,因为其他平台都是使用不带BOM的标准UTF-8编码方式。
Shift_JIS 和 Big5
1.当然,日本人也发明了自己的编码表,用以显示日文,同样也会兼容ASCII码,这就是Shift_JIS编码,而港台地区使用繁体中文,也制作了自己的编码表,称为Big5编码。