概述
编码和解码
计算机工作在“比特位(bytes)”下,因此,如果想要表示人类语言中的各个字符就需要利用比特位序列来代表。
所以,我们需要制定一个规则来将字符转换为计算机可存储的比特序列,这便是“编码”。
反过来,将存储的比特序列转换回对应字符进行显示的过程就是“解码”。
编码是为计算机服务的,而解码是为人类服务的,编解码实际上就是为计算机与人类沟通服务的。
乱码的产生
一方面,通过编码和解码,可将字符和比特序列相互转换。
另一方面,人类语言多种多样,相应的字符符号也是多种多样,而开始的时候大家都各自制定自己的编码和解码规则,所以出现了多套规则。
因此,我们可以预测,转换错误会以三种方式出现:编码错误、解码错误和编解码冲突。
编码错误:由于字符数量庞大,所以一种编码规则几乎不可能囊括所有字符,因此,当一种编码规则试图编码一个不在其中的字符时,会出现问题。比如,使用 ISO-8859-1 编码中文会得到“?”。这通常是一种单向特殊转换,换句话说,无论使用哪种方式解码都不能得到原字符。因此,保存时应选择合适的编码。
解码错误:解码显示依赖字体库,如果缺失对应的字体库,将不能正常显示字符。比如,在英文系统中中文显示为方框。此时,需要安装相应的字体库。
编解码冲突:由于编码和解码规则多种多样,如果我们错误地使用一种解码规则来解码另一种编码方式编码的比特序列,那么,通常会(除非兼容)得到不可预测的结果。
由于以上错误,最终显示的字符串通常是不可读的,因此称为“乱码”。
相关定义
抽象定义
字符集合(Character set):各种字符的总称。
编码:将字符转换为比特序列的过程。
解码:将比特序列转换为字符的过程。
术语
字符集(Charset):规则集合的名字。字符集=字库表+编码字符集+字符编码。
字库表(Character repertoire):可读或可显示字符的数据库,决定了整个字符集能表示的所有字符的范围。
编码字符集(Coded character set):字符集中字符对应的编码集合,即代码点集合。
代码点(Code Point):一个数字,代表某个字符在字库表中的位置,即在编码字符集中的序号。比如:ASCII 字符集中,字符 A 的代码点是 65。
字符编码(Character Encoding):一个映射关系,代码点和二进制存储格式之间的转换关系。比如:ASCII 编码中,65 被存储为 01000001(8 位)。
解析
字符集定义了如何将字符转换为二进制格式的规则。其中,字库表定义了其包括的字符范围,并用代码点将相应字符集合表示为编码字符集,最后通过字符编码将代码点转换为二进制格式存储或传输。
简而言之,字符集定义了有哪些字符,如何将这些字符转化为数值表示,如何存储这些数值。
回看这些术语,字符集、编码字符集和字符编码可能是比较容易混淆的,其中字符集和字符编码的混淆尤为普遍。
字符集和编码字符集应该比较好分辨,字符集是一整套规则,而编码字符集通俗点说就是一堆代表字符的数值而已。
字符集与字符编码常被混用,从上面的定义就可知它们是不同的概念。字符集包含字符编码,可以说字符集是从字符到二进制的转换规则,而字符编码是从代码点到二进制的转换规则。
而且一种字符集并非只能包含一种字符编码,比如 Unicode 字符集就包含 UTF-8、UFT-16 等字符编码。简单来说,我们知道,代码点只是一个数值,存储该数值时使用 8 位、16 位还是其他多少位是可选的。因此,可以有多种字符编码。
常见字符集与编码
字符集 | 字符编码 | 说明 |
---|---|---|
ASCII | ASCII | 单字节,用低 7 位表示,128 个字符。可表示部分西欧语言。 |
ISO-8859-X | ISO-8859-1~ISO8859-15 | 单字节,256 个字符。涵盖大多数西欧语言字符和希腊语。不能对中日韩等语言编码。 |
GBXXX | GB2312 | 《信息交换用汉字编码字符集 基本集》 。双字节。可处理大部分中文常用字。 |
GBK | 《汉字内码扩展规范》 。双字节。 完全兼容 GB2312-80 标准,支持国际标准 ISO/IEC10646-1 和国家标准 GB13000-1 中的全部中日韩汉字,并包含了 BIG5 编码中的所有汉字。 | |
GB18030 | GB18030-2005 《信息技术中文编码字符集》 。变长:单字节、双字节和四字节。 以汉字为主并包含多种我国少数民族文字(如藏、蒙古、傣、彝、朝鲜、维吾尔文等)的超大型中文编码字符集强制性标准。 | |
Big5 | Big5 | 双字节。 适用于台湾、香港地区的一个繁体字编码方案。 |
Unicode | UTF-8 | 变长字节。节省空间,适合传输和通信。 |
UTF-16 | 变长字节,大部分双字节。不兼容 ASCII。 | |
UTF-32 | Unicode 代码点 4 字节,其他 Unicode 编码方式不定长度。 |
小结
- 字符集是由 3 部分组成的,且它在概念上是包括字符编码的。
- 字库表将字符对应的代码点集合为编码字符集,再由字符编码转换为二进制存储格式。
- 一个字符集可以包含多个字符编码。