UTF-8、GBK、Unicode关系总结

523 阅读2分钟

这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

一.传统编码

1.根据第一个字节来选择代码页中不同的码表进行解析

①.代码页:内码表,从字符映射到单字节值或多字节值的表格中的表现

②.码表:就是二进制对应的具体的值(个人理解)

2.中文字符集

①.GB2312:目前最常用的 ,涵盖了所有简体字符及一部分其他字符

②.GBK:(K 代表扩展的意思)在①基础上,加入了繁体字符及其他

③.GBK最高位为1,第一个字节位于0x81(1000 0001) – 0xFE(1111 1110)之间

④.这两个字符集的字符都是使用 1-2 个字节来表示。

⑤.GBK中的英文也是用ascii表示

3.ASCII 字符共128个,编码规定使用单字节,低位的 7 个比特去编码所有的字符

4.美国 ANSI 组织制定了 ANSI 标准字符编码,通常指的是平台的默认编码,例如英文操作系统是 ISO-8859-1(单字节编码,256个),中文系统是 GBK

5.造成乱码的原因就是因为编码规范不一样,使用了错误的字符编码去解码字节流

二.Unicode字符集

1.理论

①.一个全人类达成共识的巨大的字符集,在一份文档中显示所有字符

②.为每个字符进行统一编号,分配唯一的字符码(Code Point)

③.将字符集和字符编码方案分离,决定最终字节流的是具体的字符编码

④.Unicode编码,是对 UTF-8 等具体编码方案的统称,并不是具体的编码方案。

2.UTF-8 采用 1-4 个字节来编码字符

①.一个字节,最高位为 0,表示这是一ASCII 字符(00 - 7F)。所有 ASCII 编码是UTF-8

②.一个字节,以 11 开头,连续的 1 的个数表示此字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。

③.一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到字符首字节

④.英文字母被编码成1个字节,汉字通常是3个字节

3.UTF-16:任何字符用 2 字节表示

4.BOM(Byte Order Mark):字节顺序标记,在文本头部,Unicode中标识文件采用的编码