字符编解码_篇二

阅读条件:

对字符编解码有一些了解,但是又不够深入,在实际项目中遇到问题有些束手无措的同学


<!--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的概念我们后面不会涉及,我们在这里稍微介绍下.

一般其功能包括两种:

  1. 把CES的值映射到一套更受限制的值域内,以满足传输环境的限制,例如Email传输时Base64或者quoted-printable,都是把8位的字节编码为7位长的数据.

  2. 另一是压缩CES的长度,如使用LZW或者行程长度编码等无损压缩技术。

总结

现代编码模型

本章我们主要介绍了一些基本概念和现代编码模型.其中现代编码模型非常重要,因为后面我们会涉及相当多的术语和概念,而它们都在编码模型中,有自己的位置.

所以熟悉编码模型有助于厘清概念.