编码(一):编码简介

    xiaoxiao2021-03-25  174

    基本概念

    字符:字符是指计算机中使用的字母、数字、字和符号,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。 字符集:一组抽象字符的集合。字符集常常和一种具体的语言文字对应起来, 该文字中的所有字符或者大部分常用字符就构成了该文字的字符集。比如:英文字符集,中文字符集等。 编码字符:将字符内的字符排序,然后和二进制数字对应起来,这个字符集叫做被编码过的字符集,如:ASCII字符集、GB2312字符集、Unicode字符集等,这是字符集的另一种含义。我们通常所说的字符集是这个含义。 字符编码:编码字符集在计算机上的存取方式。一些字符集,如:ASCII字符集、GB2312字符集等不仅代表编码的字符集,也是默认的编码方式;而Unicode字符集有UTF-32、UTF-16、UTF-8等编码方式。

    字符集编码发展历史

    ANSI编码阶段

    ASCII码: American Standard Code for Information Interchange,单字节编码,共128(0~127)个,用一个字节的低7位表示。0~31和127,共33个,表示控制字符,如:回车、换行、删除等;32~126是可打印字符,即可通过键盘输入并表示出来。存储英文文字是没有问题的,当时世界上所有的计算机都采用了这个编码。ASCII被定为国际标准之后的代号为ISO-646。ISO-8859-*系列: 当计算机传到西欧国家时,虽然那些西欧国家也使用拉丁字母语言,但是还是有些字符不同,再加上还有什么西里尔字母的东欧语言,希腊语,希伯来语等等,ASCII码就不够了,所以就把剩余的1位用上,这些字符集叫做扩展字符集。比如:ISO-8859-1是为英语做的扩展集,也叫做Latin-1;ISO-8859-7是希腊语的字符集等等。gb2312 当计算机传到中国时,由于汉字的个数远远大于256,所以我们直接将128~256之间的这字符取消掉,规定:前127个字符与ASCII相同,大于127的两个字符连在一起表示一个汉字,前面的一个字节(高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。GBK 它的出现是为了扩展 GB2312。它的编码范围是8140~FEFE(去掉XX7F),共23940个码位,共收录汉字和图形符号21886个,其中汉字(包括部首和构件)21003个,图形符号883个。它的编码和 GB2312,所以采用 GB2312 编码的字符可以使用 GBK 解码,但反之亦然。

    Unicode编码

    Unicode: Unicode,全称:Universal Code,是一个由“Unicode学术学会”机构制定的字符编码系统,开始于上世纪80年代。 Unicode编码主要目标:制定一套包含全世界所有字符的编码方案。 Unicode最初的设计使用两个字节(65536个码位)存储所有的字符,但是很显然65536个码位是不够用的,当意识到这一点的Unicode大部分的规范已经制定完毕,也有相当程度的普及,完全推倒重来是不现实的。这成了一个遗留问题,也是surrogate pair这种蹩脚解决方案的发端。USC: 通用多八位编码字符集(Universal Multiple-Octet Coded Character Set)是ISO组织从1984年开始研究制定的一个全新的标准,标准编号为:10646。ISO的目标与Unicode学术学会一样。 UCS的结构是一个四维的编码空间,每一维由一个字节(八位二进制位)组成,范围是00到FF.于是,UCS总体上分为128个群组(Group 00-7F),每一群组由256个平面(Plane 00-FF)组成,每一平面有256行(Row 00-FF),每一行256个编码位(Cell 00-FF).所以,每一平面包括65,536个字符位(Character Position 0000-FFFF).整个编码字符集的每个字符都由4个字节,按“组-面-行-列”的顺序表示.所以UCS的可编码空间为:128 × 256 × 256 × 256.UCS将其第一个平面(00群组中的00平面)称作基本多语种平面(Basic Multilingual Plane,BMP). 在UCS中,目前只有00组是重要的,Unicode学术学会断言,在可以预见的将来,甚至不可能用完00组中的前17个平面(00平面到10平面).因此,Unicode只定义了ISO 10646的第00组的前17个平面.事实上,目前绝大多数字符,都分配在第00平面BMP中. UCS有两种方式来表示一个字符编码:四字节正规形式(UCS-4,Four-octet canonical form)和双字节基本平面形式(UCS-2,Two-octet BMP form).UCS-4用4个字节来表示一个字符.第一个字节表示组,第二表示平面,第三表示行,第四表示单元号或列. 当系统只使用BMP的字符码时,可以省略群组和平面中的八位,将字符码由32个位缩短为16个位,标记为UCS-2.Unicode和UCS的合并: 由于Unicode和UCS目标一致,所以在1991,Unicode学术学会和UCS工作组开始讨论合并的问题。 Unicode和UCS-2同样采用16位编码. UCS-2在BMP中开辟了一个特殊的区间(D800 - DFFF)– 代理区,并平分成两个区,分别称为高半代理区(High-half Zone,D800 - DBFF)和低半代理区(Low-half Zone,DC00 - DFFF),各有1024个码位.使用时,从高低两个代理区中各取一个编码组成一个四字节的代理,来表示一个在BMP以外平面上的编码字符位.这样一来,总共可以多表示1024×1024个字符,映射到00群组中的01到10平面(共16个平面).Unicode的编码方式: Unicode只是一个字符集,并没有实际定义在计算机中存储方式,即Unicode 的实现方式.应该说,对Unicode编码的实现方式根据不同平台可以有不同实现.Unicode实现方式称为Unicode转换格式(Unicode Translation Format): UTF-16:用两个字节来表示 Unicode 的转化格式,它采用定长的方法。UTF-16利用代理对来访问BMP之外的字符编码。 UTF-8:UTF-16 统一采用两个字节来表示一个字符,虽然表示上简单,方便,但是有很大一部分字符用一个字节就可以表示,这样浪费了存储空间,同时在现在网络带宽还非常有限的情况下,这样会增大网络传输的流量。而UTF-8 是一种可变长的编码方式,每个编码区域有不同的编码长度,每个字符都可以用 1~6 个字节表示。 UTF-8 的编码规则如下: 如果是一个字节,最高位为 0,则表示1个ASCII 字符。 如果是一个字节,以11开头,则连续的1的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 utf-8 字符的首字符。 如果一个字节以10开头,表示它不是首字节,需要向前查找才能得到当前字符的首字节。
    转载请注明原文地址: https://ju.6miu.com/read-171165.html

    最新回复(0)