深入理解序列化与反序列化
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 字符编码

1.2.1 字符集与字符编码

字符集表示字符的集合,从逻辑上对字符进行了编号和定义,但并不规定每个字符如何表示和存储。

字符编码约定了字符在计算机中如何表示和存储,是字符集的物理实现方式。一种字符集可以有多种字符编码。例如Unicode字符集,可以有UTF-8、UTF-16、UTF-32三种编码形式。

1.2.2 英文字符集与编码

英文字符编码ASCII:ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,后成为国际标准ISO/IEC 646。ASCII第一次以规范标准发表于1967年,最后一次更新于1986年,到目前为止共定义了128个字符。

扩展ASCII码从128开始,允许将每个字符的第8位用于附加的128个特殊符号字符、外来语字母和图形符号。目前主流的操作系统都支持使用扩展ASCII码。

1.2.3 中文字符集与编码

· GB2312编码

GB2312编码于1980年被提出,所有汉字字符在计算机内部采用2个字节来表示,每个字节的取值范围为[129-255],最高位规定为1。小于127的字符与ASCII编码兼容。

· GBK编码

GBK是GB2312的扩充,在1995年被提出,除了收录GB2312的所有字符,还收录了其他不常见的简体字、繁体字等。GBK中的英文字符用单字节表示,中文字符用双字节表示。在GBK字符编码中,如果第一个字节大于128,则再往后找一个字节,组成汉字;如果第一个字节小于128,则表示一个单字节。

· GB18030

GB18030在2000年被提出,是取代GBK 1.0的国家标准。GB18030还增加了对日文、韩文、藏文、蒙文等文字的支持。GB18030编码采用单字节、双字节和四字节方案,其中单字节、双字节和GBK是完全兼容的,四字节编码的码位收录了中日韩扩展的6582个汉字(对应Unicode码范围:0x3400-0x4db5)。

· Big5编码

Big5是台湾财团法人信息产业策进会于1983年设计的中文共通内码,用于解决繁体字的编码及信息交换。由于Unicode已完全包含了Big5字符集,所以在繁体字使用区域,操作系统和应用软件都广泛使用了Unicode编码技术,Big5正逐步被取代。

1.2.4 Unicode字符集与编码

· Unicode字符集

Unicode为全世界所有的字符分配了唯一的数字编码,编码从0开始,可以一直往上增加。Unicode字符编码的格式为十六进制,在十六进制数值前增加“U+”前缀。例如,汉字“中”的Unicode编码为U+4E2D。Unicode维护了一张全局的字符和编码映射表,每当有新增字符,Unicode便会发布新版本。

Unicode约定了每个字符的编码,但并没有约定编码如何存储,而UTF-32、UTF-16、UTF-8则用于解决Unicode编码的物理存储问题。

· UTF-32编码

UTF-32将字符编码直接转换为二进制数,存储长度为4个字节。例如,汉字“中”的Unicode编码为U+4E2D,直接转化为二进制数0100 1110 0010 1101(省略了高位2个字节,值为0)。UTF-32在存储编码时需要考虑采用Big-Endian还是Little-Endian。

· UTF-16编码

UTF-16使用变长字节表示编码:

1)对于编码在U+0000到U+FFFF之间的字符,用2个字节表示。

2)对于编码在U+10000到U+10FFFF之间的字符,用4个字节表示。

同理,UTF-16在存储编码时需要考虑字节序列是Big-Endian还是Little-Endian,所以有UTF_16BE和UTF_16LE之分。

以汉字“中”为例,UTF-16的应用示例如下:

img

· UTF-8编码

UTF-8是一种针对Unicode编码的可变长度字符编码实现方式,编码长度为1至4字节。它可以用来表示Unicode标准中的任何字符,而且编码中的单字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只需做少部分修改即可继续使用。

编码特征:

1)如果第1个字节的第1位为0,则表示0-127范围的ASCII码。

2)如果第1个字节的前n位都为1,n+1位为0,剩余的n-1个字节均为10XXXXXX。

根据上述编码特征,表1-3汇总了Unicode编码和UTF-8编码的对应关系。

表1-3 Unicode编码与UTF-8编码的对应关系

img

编码规则:

1)根据表1-3,找到字符对应的Unicode编码所属的范围,确定二进制格式。

2)将Unicode编码的二进制序列依次从低位向高位填充到二进制格式模板里,得到的结果便是UTF-8编码。

例如,汉字“中”的Unicode编码为U+4E2D,根据表1-3可知是三字节表示,由低位向高位填充,如表1-4所示。

表1-4 汉字“中”的UTF-8表示

img

以汉字“中”为例,UTF-8的应用示例如下。

img
img