目录
特别说明:本篇是收集网上对于编码发展不同描述而完成的,由于网上转载来转载去,我也不知道到底哪个属于正派,只好梳理一下最后再加上自己的理解。侵权删。
一、ASCII第一个编码集合的诞生及发展
起初计算机刚发展时,发明这种机器的人使用八个不同位数的开关(只能是0和1)表示不同的状态,他们称之为“字节”,字节是所有编码的基础,所有的编码都有字节组成。后来根据这些字节发明出了一种处理字节的机器发明者称之为计算机。最开始计算机被发明于美国,八个0和1可以组成256种组合,于是他们约定每个组合状态代表一个用途,比如遇上0×10, 终端就换行,遇上0×07, 终端就向人们嘟嘟叫,例好遇上0x1b, 打印机就打印反白的字,或者终端就用彩色显示字母。由于0x20以下的组合基本是用来控制计算机的,因此被称为“控制码”。后续的,他们把0x20-127这之间的组合全部用字符、符号和数字等填入,这样这些规则就可以支撑起他们起初的需求了。于是,ASCII编码诞生,此编码也被称作为American Standard Code for Information Interchange。
但随着计算机的发展,很多国家的语言使用的不是英文,于是制作委员组把127后面剩下的组合使用画表格时需要用下到的横线、竖线、交叉等形状以及带音标的字母等等全部填入,127后面的字符集就被称为“扩展字符集”。
二、GBK编码的诞生及发展
随着计算机的进一步发展,中国引入了计算机。但传到中国时,起初256个位置已经全部早就填满了,况且中国汉字众多,就算256个位置都有也完全不够6000多个常用汉字使用。于是我们定义了一个新的编码规则:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。不仅仅包含了中国汉字,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。于是GB2312诞生了,GB2312是对ASCII中文字符集的扩展。
但随着计算机进一步在中国发展,使用范围越来越广,很多人发现自己的名字打不出来,于是我们不得不继续把 GB2312 没有用到的码位找出来老实不客气地用上。 后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK扩成了 GB18030。
于是DBCS(Double Byte Charecter Set 双字节字符集)标准诞生了。在DBCS系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程序为了支持中文处理,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了。此时,1中文字符=2英文字符。
三、Unicode编码的诞生
DBCS双字节字符集诞生了就意味着其他国家也能像中国一样构造自己的编码体系,但随着这样的发展就有个问题:每个国家都有自己的编码,要正常的显示每个国家的编码,就必须装上相应编码的字符系统,但这么多国家,每个国家都装一套容易出错,也太浪费空间。
随着这种问题的产生及发展,ISO(国际标准化组织)决定解决这个问题,于是他们废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号 的编码!他们打算叫它为”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“。
unicode开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是 ISO 就直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些“半角”字符,unicode保持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。
一种编码的诞生肯定会引起暂时的不适:strlen函数靠不住了,原来使用strlen函数对比中文和英文为1:2,但是现在是1:1。
四、UTF系列编码的诞生及发展
unicode在很长一段时间内无法推广,直到互联网的出现,为解决unicode如何在网络上传输的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。
五、各编码之间的关系
各编码之间的关系图:
个人理解为,每个编码都对起初的ASCII编码做了包容,所以ASCII码转其他码直接就能转过去,但是其他的编码转到ASCII肯定就是不行的。另外,除了ASCII码以外,所有的编码要互转,必须得经过Unicode编码中间层或者使用编码对照表去转码,否则便会得到乱码。