阅读条件:
对字符编解码有一些了解,但是又不够深入,在实际项目中遇到问题有些束手无措的同学
<!--more-->
前言
在上一篇,我们已经介绍了字符编码模型.如果还不熟悉CCS,CEF,CES概念的同学,可以回去再看看上一篇
本章我们来讲解字符编码方案的进化史.我将整个发展史分为上古时期,混乱时代和天下归一三个阶段,下面分别来介绍.
上古时期
在远古时期,在计算机之前,事实上已经有了字符编码的概念.但是年代太过久远,我们不再考虑.
ascii码呱呱落地
上古时期,计算机作为一个新生事物刚刚在美国诞生.很明显这个时候美国人民已经有了显示字符的需求.那么显示哪些字符呢?很幸运,美国人民用的字符比较少,加上各种控制符凑了凑大概是128个.一个字节都不用,7个比特就够了.所以美国在上世纪60年代颁布了ascii码.
关于ascii码的细节,我们不再赘述,相信大家都已经比较熟悉了.
latin-1码诞生
随着时间的流逝,计算机走出了北美大陆,来到了欧洲.虽然大家都是拉丁语系的,但是大家用的字符还是稍有不同的.比如法国人民就喜欢在拉丁字母上加上音调.那我们就得扩展字符的映射关系了.
运气还不错哟,ascii是按字节传输的,还给后面的扩展留了一个比特.这样的话,我们还可以再编128个字符.这样一个名叫latin-1
的编码方案就出炉了.我们主要是给西欧人民使用的.
KOI8系列
ascii码是大哥,大家都比较尊重他.但是你个西欧小弟都有了自己的字符编码,那么我们当时伟大的苏维埃政权当然要有自己的编码方案啦.
运气也不错哟,斯拉夫文字字符同样不多.128个字符同样够用,这样就诞生了KOI8系列的各种编码方案.花式使用128~255这个范围来映射各种字符.
小结
细心地同学已经发现在上古时期,其实已经出现了编码不兼容的问题了.虽然传输的大小都是1个字节,但是小于128还好说,大家都是一样的映射关系.但是大于128的时候,真的是各说各话了.
上古时期虽然人心开始思变了,但总的来说还算和平.毕竟计算机的使用范围还比较小.
混乱时期
计算机的发展势不可挡,很快就传到了全世界范围.大概是上世纪80年代初,我们国家也有了在计算机上显示自己文字的需求.那么就开始搞啊.
GB2312
中华文化博大精深,我们大家都知道.不要说128个字符了,就是刨去ascii码,区区一个字节显然是容纳不了我们博大精深的中华文化的.
没办法,我们必须得上两个字节了.两个字节最多可以表示65535种可能性,那我们倒也是用不了那么多啦.同时,我们还要考虑到兼容ascii码的问题.也好办,我们使用两个字节编一个汉字,同时呢我们每个字节从0xA1
开始.大概编了7445个字符,6763个汉字.
这样有什么好处呢?这样我们的GB2312编码就可以兼容ascii码啦.我们每读取一个字节,先看看大小,如果小于128,那么就是一个ascii字符.如果大于128就再读取一个字节来组成一个GB2312编码,当成一个汉字.
像我们这种上了年纪的老同志,都知道当时会说一个英文一个字节,一个汉字两个字节就是这个原因.
GBK
GB2312是个好东西啊,解决了我们国家绝大多数汉字输入显示的问题.中国人民从此可以站起来啦.
但是呢,站的时候还有点小问题.就是有些稍微生僻点的汉字显示不了.比如镕
字,祎
字.怎么办呢?
得扩展啊,看看我们的GB2312还有没有扩展空间呢?仔细一分析,嘿!还真有.既然第一个字节已经可以判断出是ascii码还是GB2312编码,那么我们为啥还得让第二个字节小于0xA1
呢?
中国人民的老朋友--微软急人民之所急,就这样颁发了GBK编码.在完全兼容GB2312的基础,一共是编了27484个汉字,基本上把所有的汉字都编进去了.
GB18030
全国人民大团结万岁.虽然GBK解决了汉字的问题,可是我们毕竟还有其他55个少数民族的兄弟姐妹要照顾.
于是呢,我们又颁布了GB18030
标准,包含的字符数高达7w+.这是一个变长编码,使用两字节或者四字节编码,与GBK完全兼容.
Big5
同一时期呢,在我们的宝岛台湾同样诞生了一种编码方案,主要是为了繁体中文服务的.它拥有一个狂霸酷拽吊炸天的名字,叫做倚天中文系统.又被称为大五码.
ANSI
在Windows系列的电脑上,我们经常还会看到一种ANSI编码,这其实是微软自己创造出来的一种概念.
它主要是指当前系统的(locale)的遗留(legacy)编码.不得不说,这是一个大坑.因为有的时候,你根本不知道它具体代表哪种编码.
通常在我们的电脑上,如果是安装中文系统,它可能是指GBK
编码.如果你选了英文系统,它也可能是ASCII
.在其他国家地区,它随时变化给你看.
别名
就像你大名叫李明,小名叫狗蛋一样.在字符编码的发展过程中,除了我们常用的这些名字.其实同一种编码方案还有些其他的小名.
比如Windows系统,为其他所有的编码方案都取了小名,以cp开头.比如GBK又被称为cp936.
而ISO组织呢,又给全世界好多编码方案取了小名,基本都是ISO-XXX
,比如latin-1
又被称为ISO-8859-1
.
这部分大家只要大概知道就好,一个王八可能有好几个马甲即可.
小结
在上古时期,大家都使用单字节编码.但是到了混乱时期呢,我们就引入了MBCS(Multi Byte Character Set),也就是多字节编码的概念.
而我们主要接触的GB2312
和GBK
主要是使用两字节编码,所以又被称为DBCS(Double Byte Character Set).
这个阶段,很多国家都颁布了自己的编码方案.甚至一些公司和组织也颁布了自己的字符编码方案.可以算的上锣鼓喧天,鞭炮齐鸣,花枝招展,群魔乱舞了.这个乱世谁来终结呢?
总结
本节我们主要介绍了几种常见的编码方案,包括ascii
,latin-1
,GB2312
,GBK
,Big5
,ANSI
等.
相对而言,这部分编码是比较简单的.因为他们的字符和CES的编码是一一对应的.在下一章节,我们将介绍横扫六合统一天下的猪脚.