编码与解码
编码方式:计算机中所有的信息都采用0
,1
这样的二进制位来表示,那么肯定存在特定的映射规则(例如:0010 0011
-> #
) 我们将这种一一对应的规则称为编码(方式)。 常见的编码方式有 ASCII、UTF-8、GBK等
编码:我们希望将 Hi!
这句话保存在磁盘上,由于计算机只能存储 0
和1
因此我们可以将 Hi!
按照某种编码方式(ASCII)转化为 01001000 01101001 00100001
来存储。从字符串到 二进制的过程叫 编码。
解码:当我们需要将磁盘上的一句话显示在屏幕上时,先从磁盘读取二进制数据 ——01001000 01101001 00100001
, 然后按照我们之前使用的 ASCII 编码方式(对应关系集合)将二进制转为 Hi!
。从二进制到字符串的过程叫 解码。
总结:编码和解码是自然语言符号
和二进制符号
相互转化的过程,要实现一一对应的转换,就需要依赖某种对应规则,而这种对应规则就是我们所说的编码方式。
ASCII 编码
机器存储数据按照字节来存储,一个字节 8位,每一位有0
和1
两种状态。因此一个字节理论上可以表示 2^8 = 256
个不同的状态,每个状态对应一个字符就是256
个字符。
标准的 ASCII 编码标准 使用最低7位
(后7位)表示字符(最高位为0
)共 128
个字符。
- 0~31、127 为不可见字符(共
33
个) - 32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。
- 65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等
ASCII 对照表:
其他编码
英语中128个符号编码就够了,但是随着计算机的发展,网络链接了不同语言的地区和国家,即使将ASCII码中保留的最高位用掉也不够表示全世界各种语言的自然符号。
因此各个国家和地区都推出了自己地区专用的编码方式,例如中国的GBK
、GB18030
、GB2312
等,但是使用地区编码的字符无法在其他地区使用。由于编码的不一致,信息交换的成本过高,例如日本的游戏中国用户无法使用,中国发送的电子邮件法国的朋友无法阅读... ...
高昂的信息交换成本使得这样一种编码方式的诞生成为必然。即这种编码将世界上所有的符号都纳入其中,每一个符号都给予一个独一无二的编码,它将彻底的解决乱码问题。它就是 Unicode
,就像它的名字都表示的,这是一种所有符号的通用编码。
国标 GBK、GB18030、GB2312
国标编码,是一种兼容ASCII编码
的汉字双字节编码字符集(由于ASCII码
高位为0
因此,国标码兼容ASCII码
部分为单字节)常用的国标码中 GB18030
字符集更加丰富。
Unicode
注意:
Unicode
只是一个字符集,它只规定了自然符号和二进制码的映射关系,但没有规定这个二进制码的存储策略。
由于 Unicode字符集
过于庞大,在使用中会占用2~4倍的存储空间,并且很多字符存储中会出现大量冗余字节(设每个字符占4字节,英文仅需要一个字节表示,那所有的 ASCII 字符前三个字节全为 0
,这是无法接受的)
纯文本文件采用ASCII码
表示为 1M
。若内容不变改为Unicode编码
表示则会变成4M
,直接扩大了4倍。无论从何种角度来看这都是无法接受的。
UTF-8
注意: 它
不是
Unicode字符集的子集
,而是Unicode
的实现方式之一。
特点
- 它是一种变长的编码方式。
- 它使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
- 它兼容 ASCII编码
编码规则
1 与GBK的策略一致,当高位为0时,认为是ASCII字符,反之为其他字符。
2 以首个字节的高位的第一个0
前的1个数标记该字符所占字节数,其后为 unicode
码值。