引入
字符编码简明的可以这样去描述,假设有一种英语:该英语只使用26个英文字母字符,不在包含其他任何字符,那么我们可以为这种英语制作一种编码表,可以使用0-25去分别映射这26个字母,如下图:
应该注意的是,我们还有其他的编码方式,如使用1-26去分别映射这26个字母也行。
字符编码中最著名的该书ASCII标准编码,该编码定义了128个字符,足够满足美国地区的使用需求。其他字符一些与英语类似的地区以ASCII标准编码为模板制作了ASCII扩展编码或ASCII扩展编码的变种以满足自己地区的使用需求。
中国基本字符很多,采用多字节编码,常用的有GB2312和GBK编码。
为了满足国际化的需求,UNICODE统一编码标准被提出,在该编码标准中,世界上所有已知的字符都被统一映射到一个表中(该表是相对固定的),UTF-8和UTF-16是该标准的两种实现。
本文重点描述
本文重点描述ASCII标准编码,并简单的提到扩展ASCII编码、GBK、UNICODE(UTF-8 & UTF-16)几种编码,目的在于记录自己的对编码概念的认知。
ASCII标准编码
ASCII标准编码用7个二进制位去编码一个信息,最多可编码128个信息,在ASCII标准编码中这128个信息被完全使用,下面是对着128个信息的描述(可对比ASCII码表阅读):
- 0~31及127是控制字符或通信字符
- 控制字符如:
LF:换行 | |
CR:回车 | |
FF:换页 | |
DEL:删除 | |
BS:退格 | |
DEL:响铃 |
- 通信字符如:
SOH:文头 | |
EOT:文尾 | |
ACK:确认 |
- 32到125是字符
- 其中32为空格
- 48~57为0-9十个阿拉伯数字
- 65~90为26个英文大写字母
- 97~122为26个英文小写字母
- 此外还包括一些特殊符号,如 $ ^ & * # 等
ASCII标准编码的实现
ASCII标准编码的实现采用一个字节储存一个信息,ASCII标准编码中,没一位信息仅需要7个二进制位就能完成,用一个字节去存储,将最高位设置为0。
ASCII标准编码是一种单字节编码方案。
应该注意一点,这里的说道标准和实现,标准仅仅定义了一种映射(具体如码表,编码32对应了空格),实现则是在计算机上的标准体现,标准和实现这个概念在UNICODE标准的UTD-8实现和UTF-16实现处更加的分明。
ASCII扩展编码
ASCII扩展编码是用8个二进制位去编码一个信息,最多可编码256个信息,其中0-127对应了ASCII标准编码的0-127位,128-256则用于编码更多信息。
在实现上,采用一个字节去存储一个信息。
GB2312编码
GB2312编码基本集共收入汉字6763个和非汉字图形字符682个,类比于ASCII标准编码标准,这是一种逻辑上的映射。
在实现上,GB2312采用两个字节去编码信息。
GBK编码
…跳过…
UNICODE标准编码方案
在该UNICODE标准编码方案中,世界上所有已知的字符都被统一映射到一个表中,这与所有编码方案一致。
存储的信息量的大小始终是与花费的代价成正比,在实现上最简单粗暴的方案无疑是UTF-32,这种实现方式存储每个信息都需要32位,想想在ASCII实现上进行8位就能存储一个信息,而在GB2312实现方案中也仅仅需要16位,对存储的极不友好造成了这种编码变不流行。
UTF-8 与 UTF-16实现
在UTF-8中,采用特殊的技巧(不再赘述),使得对于一部分字符仅用8位去存储,对于另一部分字符用16位去存储,对于再另一部分字符用24位去存储,这相比于UTF-32而言对存储的改进是极大的。
而在UTF-16中,同样采取一些特殊的技巧,使得对于一部分字符仅用16位去储存,而对于另一部分字符采用32位去存储,这看起来和UTF32有点像,也很浪费,但想想16位已经能将绝大部分常用的字符囊括了,就不会再有这样的观点了。
UTF-8比UTF-16更节省空间,常用于网络传输,但其解析较为UTF-16困难,在windows操作系统底层实现上,采用的默认字符集为UTF-16实现。
一点骚话
学习UTF-8和UTF-16这两玩意时,看到一句话,UTF-8和UTF-16都是根据需要而产生的,这两者现在谁也替代不了谁,不搞清楚一些细节的地方,就很不容易理解一些本质的东西。另外在验证的时候还碰到一个叫大段存储和小端存储的概念,看到说,这玩意是计算机发展中的历史遗留,更深入的细节没有去理会,但心里:MMP,好累。