各类编码方式介绍

1.编码

计算机只能识别0和1,但是人类通过0和1来识别一串文本较为不便,因此约定某个二进制数表示一个指定的字符,这样在N个字符与N个二进制数之间建立映射关系, 这N个字符就是人类日常使用的字符集,而这种映射关系称为字符编码,其产物为字符编码表。计算机可以根据字符编码表接收、传递、展示人类能识别的字符集。
字符编码表中一般包含可显示字符(如字母、数字、标点符号、运算符号等)和控制字符(换行符、退格符等)。
字符编码方案可分为单字节双字节三字节等,能储存的字符集数量依次增加。单字节编码是使用一个8位二进制数表示一个字符, 双字节编码是使用一个16位二进制数表示一个字符。

2.ASCII

①美国信息交换标准代码(American Standard Code for Information Interchange),是美国国家标准会制定的单字节字符编码方案
ASCII用8位二进制数表示,其中最高位为0,用剩下的7位排列位组合来表示128个字符。
ASCII一共定义了128个字符,包括95个可显示字符(52个英文大小写字母,10个阿拉伯数字,33个英文常用标点符号、运算符号等)、 33个控制字符。(ASCII码对照表)
ASCII存在一定的局限性,它只能表示英语,不能表示法语、俄语等。

3.EASCII

①延伸美国标准信息交换码(Extended ASCII),是将ASCII码由7位扩充为8位而成,共有256个字符。
EASCII相较ASCII增加了表格符号、计算符号、希腊字母和特殊的拉丁符号。(EASCII码对照表)

4.GB2312

①信息交换用汉字编码字符集(GB代表”国标”),用于汉字处理、汉字通信等系统之间的信息交换。(GB2312对照表)
GB2312一共定义了7445个字符,其中一级汉字3755个,二级汉字3008个,拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母682个。
GB2312向下兼容ASCII,但是并不包括ASCII中的字符(如果一个字符在ASCII中,则使用单字节ASCII方式编码,否则使用GB2312方式编码)。
GB2312将所有字符进行分区管理,共划分94个区(目前只用到了01~87区),每个区可以包含94个字符。因此定位一个字符需要使用16进制的区位码(标识字符在第几分区的第几位)。
GB2312采用双字节编码,第一个字节表示区码,第二个字节表示位码。为了兼容ASCII,将区码和位码加160后再进行计算。(为什么?)

例如:'帅'在第43区,第07位
区码:43 + 160 = 203 = 11001011 = CB          最终二进制码:1100101110100111
位码:07 + 160 = 167 = 10100111 = A7          最终GB2312区位码:CBA7

5.GBK

①汉字内码扩展规范(GB代表”国标”,K代表”扩展”),GBK是GB2312的扩展版,共定义了21886个汉字和图形符号。
GBK相较GB2312增加了繁体汉字、CJK汉字(中日韩统一表意文字)等。
GBK采用双字节编码,共分为汉字区、图形符号区、用户自定义区。

6.Unicode

统一码、万国码、单一码,可以理解为人类使用的所有字符的集合(官网)。
Unicode为世界上每种语言中的每个字符设定了统一并且唯一二进制码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode只是一个字符集,仅仅定义了字符与二进制编号的映射关系。
Unicode编号从 0x000000 到 0x10FFFF,一共可以容纳1114112个字符,但是目前只定义了143859个字符(Unicode13.0,2020-03-10发布)。
为了便于管理,Unicode将所有字符分为17个平面(00~17),每个平面包含65536个字符(0~65535)。
Unicode用U+XXXXX表示,例如“帅”是第24069个字符,表示为U+5E05。

7.UTF-8

8-bit Unicode Transformation Format,八位Unicode转换格式。
Unicode仅仅是个字符集,而UTF-8则是一种编码方案。它定义了如何将Unicode编号转换为字节序列。
8是指以8位(一个字节)为可变长单位,UTF-8可将Unicode编号编码为1~4个字节的二进制序列。
由于互联网中大多数内容是英文,而UTF-8对英文编码只需一个字节,耗费空间较小,所以目前UTF-8较为通用。