编码理解的漫漫长路(Unicode、GBK、ISO)

Ø 那么现在开始康康都有哪些编码方式

 1.  ASCII🐴 

  ASCII ---American Standard Code for Information Interchange,美国信息交换标准代码,

  最新发表于1967年,共128个字符,7位二进制表示,详细的对应见百度百科,比较简单,此处不赘述。

 2.  Unicode

  Unicode又被称为万国码,是计算机领域的一项业界标准,包括字符集,编码方案等等。它为每种语言的每个字符设定了统一且唯一的二进制编码,满足跨语言跨平台的文本转换和处理的要求。1990年研发,94年正式公布。

  • Unicode可以理解为一个字符库,理论上包含所有可能出现的字符,两个字节表示一个字符,每个字符都有一个编号,该编号也称为码位;
  • Unicode将这个库分为17个平面,从00-10 (十六进制,0x10=17),每个平面有 65536 个码位,共1114112个字符。这些平面中,第一个Unicode平面,被称为基本多语言平面,Basic Multilingual Plane,缩写BMP,其他平面称为辅助平面Supplementary Planes。
  •  Unicode的编码方案

  重点来了!

  Unicode 只是一个庞大的字符库,将字符进行了编号,在被调用前,还经过了不同的编码处理。

  1)  UCS

  Unicersal Character Set ,通用字符集,根据 ISO 10646 标准定义。又被分为UCS-2,UCS-4,且均采用BOM机制,Bytes Order Mark 机制(确定字节流的大小端序,确定字节流的Unicode编码方案)。

  UCS-2:固定使用2个字节编码,对用第一个Unicode plane。

  UCS-4 :固定使用4个字节编码。

  2)  UTF

  Unicode Transformation Format ,Unicode转换格式的意思

  a) UTF-8

  UTF-8 是一种变长编码方式,为什么是可变的呢,因为一个Unicode字符最大时需要3个字节表示,但有些字符,像简单的英文,只需要一个字节,在网络传输时,可以节省资源.

  对于一个字符,如果一个字节可以表示,那么其最高位二进制为0;多字节,那么第一个字节的最高位起,“1”的个数就是编码后的字节数,其余字节均已10开头。(这没有为什么,就是规定而已,最开始看的帖子没有说明这点,本人就比划了一个下午,搞自闭了,希望大家别踩坑了)

  具体表现方式:

  1字节 0xxxxxxx 

  2字节 110xxxxx 10xxxxxx 

  3字节 1110xxxx 10xxxxxx 10xxxxxx 

  4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 

  5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

  6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

  可以看到,可用来标识编码的实际位数最多31位,即除去这些1和10控制位外,x的位数,这个编码与Unicode的编码是对应的。Unicode与UTF-8在转换时,先除去高位0,再根据所剩编码的位数,决定所需的最小的UTF-8编码位数。

  具体对应关系如下

十进制

Unicode符号范围(16进制)

UTF-8编码(二进制)

0~127

0000 0000~0000 007F

0xxx xxxx

128~2047

0000 0080~0000 07FF

110x xxxx 10xx xxxx

2048~65536

0000 0800~0000 FFFF

1110 xxxx 10xx xxxx 10xx xxxx

65536~114111

0001 0000~0010 FFFF

1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx

  理解例子:
    如字符‘A’,他的Unicode码位是65,二进制为0100 0001,用UTF-8一个字节即可表示,也是0100 0001,这很直接的说明UTF-8是向下兼容ASCII的。

         再例如这个‘老’字,在Unicode中的码位是63796,对应的Unicode编码为F934,把它转化为二进制是1111 1001 0011 0100,转化为UTF-8编码需要三个字节表示,从低位到高位填入,1110 1111 1010 0100 1011 0100,转换为十六进制就是EFA4B4。

 

  b) UTF-16

  UTF-16使用2或4个字节编码。若码位在BMP第一平面,使用2个字节,2^16=65536,恰好可以完全表示BMP;BMP外的辅助平面,使用4个字节编码。

  具体编码方式:这4个字节,即16 Bit,被称为代理对。第一部分为高位代理,或前导代理,字节范围(D800~DBFF);第二部为低位代理或后尾代理,字节范围(DC00 ~DFFF)(这部分码位在BMP中是保留的)。

       辅助平面码位表示具体规则

  a) Unicode码位转化为16进制,减去0x1 0000 ,将结果扩展20位,高位不足补零。在上面我们有提到,Unicode的范围最大为0x10 FFFF,所以最大差是0x0F FFFF;

  b) 将差按照高低各十位分割;

  c) 高十位扩展至2个字节,再加上0xD800;低十位同样扩展至2个字节,加上0xDC00。

 

       理解例子:

       字符‘A’在BMP范围中,Unicode码位是65,十六进制为0x0041。在传输时,这里会有一个码序问题,是0x4100(小)还是0x0041(大),这个同样依据BOM机制,加入控制信号,大端序时在数据前加上FE FF,小段序则加上FF FE。

       字符 在辅助平面内,Unicode码位是66368,其十六进制为0x1 0340。先将0x1 0340-0x1 0000,得到0x0 0340,扩展到20位,且分割高低十位:0000 0000 00|11 0100 0000,高位加上D800;低位加上DC00;得到结果D800 DF40。

 

   3. ISO-8859

       ISO-8859是一系列编码,由8位二进制表示,共256个字符,前128个字符与ASCII码是相同的,后128个字符,每个国家都是不一样的;参考百度百科对应关系。这里简单提一下ISO-8859-1,它是ISO-8859家族中的一位成员,又叫Latin-1,8位为一个字节,很多协议中,默认使用的是该编码;缺点是256个字符还是不够用,常和其他编码方式配合出现。

   

  4.GB2312

       GB2312 -1980 是中国国家标准总局1980年发布的《信息交换用汉子编码字符集》的标号。

       共收录汉字6763个和非汉字图形字符682个,共7445个;

       整个字符集分为94个区,每区94位,共8836个;

       每位1个字符,区和位组合对汉字编码,称为区位码

       二进制表示字符:将区位码换算为16进制,再加上2020H,就是我们的国标码;国标码加上8080H,就是计算机机内码。

   

  5.GBK

       GBK ,”国标扩展”的字母首拼,全称为《汉字内码扩展规范》,制定于1995年12月1日;

       GBK向下兼容GB 2312编码,在其基础上,使用双字节编码方案,范围为8140~FEFE(十六进制) (剔除xx7F),共23940个码位,其中21003个汉字。支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年10月制定, 1995年12月正式发布,目前中文版的WIN95、WIN98、WINDOWS NT以及WINDOWS 2000、WINDOWS XP、WIN 7等都支持GBK编码方案。 

 

参考链接:

  官网对照Unicode字符编码表地址:https://unicode-table.com/cn

  转化查询参考地址:https://www.qqxiuzi.cn/bianma/zifuji.php

                                 https://www.qqxiuzi.cn/bianma/Unicode-UTF.php

  https://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html

  https://www.cnblogs.com/leesf456/p/5317574.html

posted @ 2019-10-28 15:23  Voyager0  阅读(403)  评论(0编辑  收藏  举报