分享

字符集编码发展简史

 Home of heart 2011-12-22
字符集编码发展简史

字符集编码发展到今天,其实经历了一个漫长而曲折的过程。从开始的ASCII,到后来的ANSI,再到现在的UNICODE

计算机是由发达资本主义国家发明的,而这些国家基本都是英语国家,用8位(256中状态)足以表示他们使用的所有符号(字母、数字、标点符号、控制字符等),而且还用不完(只用了前127),所以他们最终决定一个字节由8位(即8个晶体管)组成。每个字节表示一个具体的符号,然后将这些符号连起来就能表示世间万物了。这种编码就是大名鼎鼎的ASCIIAmerican Standard Code for Information Interchange美国信息交换标准码码。

ASCII就是我们常说的SBCSsingle-bye charater set,单字节字符集)。

刚开始只用了0x00-0x7f127个字符状态),后来又有新的语言国家使用了计算机,这些国家便对127号以后的空位打起了注意,并最终将256个字符全部用掉,0x80-0xff127号以后)为扩展字符集。至此人类再也没有可用的字节了。当计算机来到中国的时候,已经没有可用的字节状态来表示汉子了。讲到这里我想起了一手好玩的诗,大体内容是这样的:

上帝创造了这个世界,

可这个世界一片漆黑。

然后上帝又创造了牛顿,

将这个世界变得一片光明。

后来上帝又创造了爱因斯坦,

又将这个世界拉回到了黑暗中。

            哈哈,有意思吧。我觉得中国就是爱因斯坦,将计算机的国际化推入了火坑之中。但勤劳而富有创造力的中国人民坚信,我们会将这个世界重新变光明的。果然勇于创新的中国人民不负重望,创造出了GB2313编码规则。这种编码规则的主旨是,在原来的ASCII码(127个基本字符)基础上进行的中文扩展,这里将之前定义的127之后的扩展编码全部卡掉,进行重新定义。其实这样即使将127后的所有字符状态全部用上,也不能将中文字符全部表示,光常用的中文字符就有6千多个。中国人民的伟大才智再一次得到体现,一个字节不行,我可以用两个字节嘛。规定:一个小于127的字符意义与原来相同,当两个大于127的字节连在一起,就表示一个汉字,前面的一个字节(高字节)从0xA1-0xF7,后面一个字节(低字节)从0xA1-0xFE。这样我们大约可以组合出来7000多个简体汉字了。在这里,我们还把数学符号、罗马希腊字母和日文的假名都编进去了,连ASCII里的字符也都统统重新编了两个字节长的编码。

            GB2312为常说的全角,基本的ASCII码(小于127)为半角。

            怪只怪中国的汉子实在是太多了,后来发现还是不够用,于是干脆不再要求低字节一定小于127,只要第一个字节大于127,就认为是一个汉字的开始,不管后面的字节是否小于127,都要和第一个字节组成一个两字节的汉字。扩展后的编码方案被称为GBK标准,GBK包含了BG2312的所有内容,同时又增加了近20000个新的汉子(包括繁体字)和符号。

            后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的文字,GBK扩展成了BG18030。从此,中华民族的文化就可以在计算机时代传承了。

            当时各个国家和地区都搞出来自己的一套标准字符集编码标准,BIG5就是香港、台湾繁体中文区的字符集编码标准。由于是各自独立完成编码标准,所以最后互相不兼容。如果想让电脑显示汉字就必须安装“汉字系统”,如果想正常显示繁体就必须安装一套BIG5编码标准的“倚天汉字系统”。错装了汉子系统,显示就会全乱套。

            以上将的GB2312GBKGB18030BIG5习惯称之为MBCSmutil-byte charater set,多字节字符集),不过这些编码通常为两个字节,所以有可称为DBCSdouble-byte charater set,双字节字符集)。

            所谓ANSIAmerican National Standards Institute美国国家标准学会编码标准是只所有从基本ASCII码基础上发展起来的编码标准(即DBCS),比如扩展的ASCII码、GB2312GBKGB18030BIG5等。每种编码在ANSI标准中都为一页,比如encoding.gb2312页代表GB2312字符集编码。

            正在各个国家制定自己的DBCS编码标准时,一个叫ISOInternational Organization for StandardizationInternational Standard Organized国际标准化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废除了所有地区性编码方案,重新搞了一套可以包含地球上所有文化的文字和符号的编码方案。他们称这个方案为Universal Multiple-Octet Coded Character Set(通用多8位编码字符集),简称UCS,所称UNICODEISO直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些“半角”字符,UNICODE保持其原码不变,只是将其由原来的8位扩展为16位,而其它文化和语言的字符则全部重新统一编码。由于“半角”英文符号只用到了低8位,所以其高8位永远是0,这种大气的方案在保存英文文档时会多浪费一倍的空间。

                世间万物总是联系着的,自从DBCSUCSUNICODE)出现以后,我们经常使用的strlen函数,居然靠不住了。像中文这样的字符不再当成两个字符了,而是被当成一个。在WINDOWS编程中,SBCSMBCS模式字符串的表示都是char*的形式(并且字符串中含有中文),所以都能使用strlen进行计算,可计算出来的结果是不一样的,如下:

                MBCS(多字节字符集编码)情况下,

                Char *s = “我们123456”;

                strlen(s)  == 10;

                _mbslen(s) == 8;

                相对于MBCS模式,UNICODE相对容易理解些,因为UNICODE模式下字符串用wchar_t*表示,是无法使用strlen或者_mbslen的,只能使用wcslen

                这也就是为什么现在的CRTC运行时库)中的函数都有3种不同的形式:

                strlen:单字节字符集(SDCS

                _mbslen:多字节字符集(MDCSDBCS

                wcslen:通用多8位字符集(USCUNICODE

从前的多字符集时代,那些做多语言软件的公司遇到过很多很大的麻烦。他们为了在不同的国家销售同一款软件,不得不在区域化过程中,加装那个多字节字符集,这样把软件中的字符集转来转去,是非常容易出错的。UNICODE的出现解决了这个问题,只要装上UNICODE字符集,全世界的文字就都能认识了。于是作为软件行业老大的微软将字节的操作系统Windows NT即以后的版本都改成了UNICODE版本了。从这开始,Windows再也不用加装各种本土语言系统,便可现实世界上所有文化的字符和符号了。

由于UNICODE设计初期的局限性(并没有考虑到与现有编码的兼容性),所以使得UNICODEGBKGB18030BG2312等)在排版上完全不一样,没有一种简单的算法可以把内容从UNICODE编码和两一种编码进行转换,这种转换必须通过查表来进行。

使用UNICODE编码标准可以组合出65535中不同的字符,这已经可以覆盖世界上所有文化的字符和符号了。如果还不够也没关系,ISO已经准备了UCS-4方案(我们通常使用的是UCS-2),说简单了就是用4个字节来表示一个字符,这样的话我们理论上可以组合出将近43亿个字符,不过最高位为保留为,所以只能组合出21亿个字符,即使是21亿个,我想用到的可能性也不大了吧。

下面我们来看两个例子:

1、字符串: “I am Chinese”

ANSI存储:12Bytes

UCS-2存储:24bytes + 2bytesheader

UCS-4存储:48bytes + 4bytesheader

2、字符串:我是中国人

ANSI存储:10Bytes

UCS-2存储:10bytes + 2bytesheader  :FFFE/FEFF

UCS-4存储:20bytes + 4bytesheader

从上面两个例子可以看出,UNICODE编码比ANSI编码占用的空间要多,为了节省空间。世人有发命令UTFUnicode Transformation FormatUnicode转换模式)编码规则,版本有UTF-88-bit Unicode Transformation Format)、UTF-16UTF-32其实,我觉得UTFUNICODE一样,是不同的编码版本。UTF是对UNICODE的特殊编码。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多