阅读条件:
对字符编解码有一些了解,但是又不够深入,在实际项目中遇到问题有些束手无措的同学
<!--more-->
前言
我们上回提到,关于字符编解码,计算机只能处理0和1,而人只能理解符号.我们将符号转换为0/1的过程称之为编码,我们将0/1转换为符号的过程称之为解码.
在这个转换的过程中,必须要有一个保存了映射关系的表,来保证在编解码的过程中,信息不会丢失.
事实上,这种保存了映射关系的表有很多种,且听我们来一一分解.
基本概念
在开始我们的征程之前,让我们先简单熟悉两个概念.
字节
**字节(byte)**应该是绝大多数程序员非常熟悉的概念.它是计算机中数据存储的基本单元,是衡量数据大小的单位.也就是说,我们的符号编码以后就是以字节为单位存储在计算机当中的.不管是在网络,硬盘,U盘还是内存当中,存储的内容或许会有区别,但是存储的单位都是字节.
字符
**字符(character)**是一个抽象概念.字符是一个信息单位,是各种文字符号的统称.一个英文字母是一个字符,一个汉字是一个字符,甚至一个Emoji表情也是一个字符.
定长编码
前面字节的概念就是用于描述存储长度的,定长编码就是指在一种编码方案中,每个字符所对应的长度是固定的.
变长编码
相应地,变长编码就是指在一种编码方案中,每个字符对应的长度是变化的.有的字符编码长一点,有的呢短一点.
现代编码模型
在熟悉了基本概念之后,我们先来熟悉下现代编码模型.现代编码模型将字符编码分为了5个层次,我们可以使用这样的模型来描述我们遇到的每一种具体的编码格式.下面我们从下到上依次来了解这5个层次.
抽象字符表
ACR(Abstract Character Repertoire).我们知道每个编码格式所支持的字符是不一样的,比如Ascii不支持汉字.而抽象字符表就是表示某种编码格式所能支持的全部字符的集合.
编码字符集
CCS(Coded Character Set).编码字符集是一种映射关系,我们需要将前面的ACR集合中的字符进行简单的映射.比如Ascii将字符a
映射为十进制整数97.具体的编码格式可以有各自不同的映射方式.编码字符集在这里已经是一个映射关系了.
字符编码表
CEF(Character Encoding Form).前面CCS的映射关系还仅仅是一种数学映射关系,那么真正存储的时候我们还需要决定使用多长的字段,怎样来存储这个映射的数值.还是Ascii码中的代表字符a
的十进制整数97,我们决定使用一个字节直接将97转换为二进制来存储.
在后面介绍其他编码格式的时候,我们将看到其他不同的CEF方案.
字符编码方案
CES(Character Encoding Scheme).Ascii比较简单,一个字节可以表示所有的字符.而有些编码格式需要多个字符,那么在读写传输的过程中,必然会涉及大小端的问题.所以CES就是CEF加上了字节序列化.
通常我们说的编码格式,就是指的是CES的概念.
传输编码语法
TES(Transfer Encoding Syntax).TES的概念我们后面不会涉及,我们在这里稍微介绍下.
一般其功能包括两种:
-
把CES的值映射到一套更受限制的值域内,以满足传输环境的限制,例如Email传输时Base64或者quoted-printable,都是把8位的字节编码为7位长的数据.
-
另一是压缩CES的长度,如使用LZW或者行程长度编码等无损压缩技术。
总结
本章我们主要介绍了一些基本概念和现代编码模型.其中现代编码模型非常重要,因为后面我们会涉及相当多的术语和概念,而它们都在编码模型中,有自己的位置.
所以熟悉编码模型有助于厘清概念.