编码机

计算机基础什么是编码

发布时间:2022/10/15 19:06:20   

计算机基础--什么是编码?

作者名:丽斯

什么是编码

编码是信息从一种形式或格式转换为另一种形式的过程,简单来讲就是语言的翻译过程。我们都知道计算机使用的是机器语言即二进制码,相信大部分人都无法流畅的阅读二进制码,于是为了能够让人类更好的理解计算机输出的结果就需要将机器语言转换为自然语言,比如英语、俄语和中文等。这看似简单的语言转换过程随着计算机的普及与互联网化对语言字符的编码冲击也越来越大,编码规范的调整也伴随着整个计算机发展历史。

现代编码模型

为了能够更精确的描述在编码过程中各个产物的归属以便正确的描述产物所发挥的功能,于是多事之人将现代的编码整理为一套可以说明的模型而且分为五层之多。

现代编码模型之分层:

1.抽象字符表(ACR:Abstractcharacterrepertoire):是一个系统支持的所有抽象字符的集合,简单来说就是该层规范要确定一个系统能够包含的字符和字符形式,比如Windows支持中文,那么它的抽象字符表一定有中文字符集合而且也适配不同编码方式指定具体是何字符。

2.编码字符集(CCS:CodedCharacterSet):是将字符集中每个字符映射到1个坐标(整数值对:x,y)或者表示为1个非负整数。字符集及码位映射称为编码字符集。例如,在一个给定的字符表中,表示大写拉丁字母“A”的字符被赋予整数65、字符“B”是66,如此继续下去。简单来说这就是一个映射关系表,将一串码值映射到抽象字符表里的特定字符。

3.字符编码表(CEF:CharacterEncodingForm):该层也称为”storageformat”,对于一个包含几乎全球语言的字符集,比如Unicode字符集最多可以2的31次方个字符,用4个字节来存储一个,但是真的有必要在时时刻刻都使用4个字节来记录一个字符吗?很显然不是这样,比如拉丁字母“A”实际上需要二进制码一个字节就可以表示,于是需要一种类似于压缩方式的方法来尽量用最少空间存储不同种类字符的方式比如后面会提到的UTF。所以这一层主要是描述字符编码所能采用的编码格式。

4.字符编码方案(CES:CharacterEncodingScheme):也称作”serializationformat”,将定长的整型值(即码元)映射到8位字节序列,以便编码后的数据的文件存储或网络传输。

5.传输编码语法(transferencodingsyntax):用于处理上一层次的字符编码方案提供的字节序列。一般其功能包括两种:一种是把字节序列的值映射到一套更受限制的值域内,以满足传输环境的限制,例如Email传输时Base64或者quoted-printable,都是把8位的字节编码为7位长的数据;另一种是压缩字节序列的值,如LZW或者行程长度编码等无损压缩技术。

常用的编码

ASCII

ASCII(发音:[/ski/]),AmericanStandardCodeforInformationInterchange,美国信息交换标准代码)是基于拉丁字母的一套计算机编码系统。它主要用于显示现代英语,而其扩展版本EASCII则可以部分支持其他西欧语言,并等同于国际标准ISO/IEC]。ASCII编码由1个字节8bit来标识字符编码表映射关系,如果按字节来算最多支持个字符映射,但是由于最高位始终为0,支持的字符更少了。下图为编码表:

从图中可以看到,如果使用ASCII码表,将二进制高四位()低四位()对应ASCII码表就得到了A字符,如果要得到ILOVEY,计算机只需要得到二级制1001(I)0000(空格)0(L)1111(O)(V)0101(E)0000(空格)(Y)。ASCII码所对应的所有字符高四位首位都为0,所以ASCII码成功的用7个比特位就完成了计算机语言转换为自然语言(人类语言)的壮举,这看起来很令人振奋,美国人天真的以为IPv4的最大数...(32位)总计4,,,个地址(其中还有些专用地址占去一小部分)就能覆盖全球的网络设备。所以说当其他国家的语言比如中文、日文和阿拉伯文需要用计算机显示的时候就完全无法使用ASCII码如此少量的编码映射方式。

GB

年8月,中国开始了工程,包括了用计算机来处理中文字,展开了各种研究工作,后来到年公布了GB-80汉字编码的国家标准。GB标准共收录个汉字,其中一级汉字个,二级汉字个;同时收录了包括拉丁字母、希腊字母、日文、平假名及片假名字母、俄语在内的个字符。看起来GB已经很牛逼了,使用2个字节作为编码字符集的空间,但是个汉字是真的不够用啊。

GBK

我汉语博大精深,只有个字怎么够?于是GBK中在保证不和GB、ASCII冲突(即兼容GB和ASCII)的前提下,也用每个字占据2字节的方式又编码了许多汉字。经过GBK编码后,可以表示的汉字达到了个,另有个汉语标点符号、部首等。值得注意的是这个汉字还包含了繁体字。

GB

然而,GBK的两万多字也已经无法满足我们的需求了,还有更多可能你自己从来没见过的汉字需要编码。这时候显然只用2字节表示一个字已经不够用了(2字节最多只有种组合,然而为了和ASCII兼容,最高位不能为0就已经直接淘汰了一半的组合,只剩下3万多种组合无法满足全部汉字要求)。因此GB多出来的汉字使用4字节编码。当然,为了兼容GBK,这个四字节的前两位显然不能与GBK冲突(实操中发现后两位也并没有和GBK冲突)。我国在年和年分别颁布的两次GB编码,其中年的是在年基础上进一步补充。至此,GB编码的中文文件已经有七万多个汉字了,甚至包含了少数民族文字。

Unicode

在ASCII编码明显不够用后,美国国家标准学会又搞了几套ISO的编码规范来兼容其他中欧等国家的语言,但是兼容性还是有不少问题。最终美国加州的Unicode组织他们放大招搞了Unicode(万国码)打算借此一统江湖,最早Unicode也是最高16位2字节来进行映射,经过几番修改最终可以以最长32位4字节的空间来映射最多2的31次方个字符。看起来一切完美了,当然如果以后有了星际旅行并不一定能够完全标识全宇宙的文字。

从上面这一大堆改动来看,不管中国还是美国,在处理位数上远远低估了后续可能产生的扩展性,你可能会觉得一早就用4个字节来标识全球所有字符就完事了费那么大劲来回改。给你看一幅图你或许就会明白为什么那时候的科学家那么谨小慎微了。如图:

年IBM的硬盘,可存储5MB的数据

UTF-8又是什么

Unicode确实是一套能够满足全球使用的字符集,但是难道真的需要每一个字符都占用4个字节吗?虽然现在的存储空间已经足够大了,但是4个字节一个字符的方式还是很不明智的,比如字符“A”二进制码却需要以的方式存储。这一定不是我们想要的。于是UTF(Unicode/UCSTransformationFormat)应运而生,UTF是字符编码五层次模型的第三层,通过特定的规则对Unicode字符编码进行一定的压缩和转换以便快捷传输。UTF的代表就是UTF-16和UTF-8,千万不要以为UTF-16比UTF-8更厉害能够容纳更多字符,字符容纳数量都是是Unicode编码集所确定的范围,UTF只是通过不同的转换形式更快更高效的找到特定字符。而UFT-16比较奇葩,它使用2个或者4个字节来存储。对于Unicode编号范围在0~FFFF之间的字符,UTF-16使用两个字节存储,并且直接存储Unicode编号,不用进行编码转换,这跟UTF-32非常类似。对于Unicode编号范围在~10FFFF之间的字符,UTF-16使用四个字节存储,具体来说就是:将字符编号的所有比特位分成两部分,较高的一些比特位用一个值介于D~DBFF之间的双字节存储,较低的一些比特位(剩下的比特位)用一个值介于DC00~DFFF之间的双字节存储。

设计UTF-8编码表达方式的理由:

1、单字节字符的最高有效比特永远是0(大家可以看看其他编码方式如何别扭的兼容ASCII码的);

2、多字节序列中的首个字符组的几个最高有效比特决定了序列的长度。最高有效位为的是2字节序列,而1的是三字节序列,如此类推;

3、多字节序列中其余的字节中的首两个最高有效比特为10。

转换关系如下图:

这样我们根据所要兼容的语言不同根据UTF-8多字节最高有效比特去判断编码最终使用了多少个字节来存储,其余的字节也都满足最高有效比特为10的特点有了一定的纠错功能。简单一些理解就是UTF-16就是通过2个字节16位来控制压缩比例,而UTF-8已经以高精度的1个字节8位来控制压缩比例了。当然还有中UTF-32就可想而知,基本跟Unicode如出一辙。



转载请注明:http://www.aideyishus.com/lktp/1880.html
------分隔线----------------------------