Ascii,Unicode,UTF-8,GBK编码介绍

阅读本文需要8分钟Ascii,Unicode,UTF-8,GBK编码介绍_编码方式


ASCII编码

ascii码是7位编码,编码范围为0x00〜0x7F。ascii码字符集包括英文字符,阿拉伯数字,标点符号等。其中0x00〜0x20和0x7f共33个特殊字符。忽略最高位,只认为低7位有效。

GBK编码

GB2312

GB2312或GB2312-80是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB2312。

GB2312对汉字采用双字节编码,基于区位码设计的,收录7445个图形字符,其中包括6763个汉字。区位码把编码表分为94个区,每个区对应94个位,每个字符的区位码中01-09区是符号,数字区,16-87区是汉字区,10-15和88-94是未定义的空白区。迄今为止,区号和位号组合起来就是该汉字的区位码。收录的汉字分割两级:第一级是常用汉字计3755个,进入16-55区,按汉语拼音字母/笔形顺序分开;第二级汉字是次常用汉字计3008个,放置56-87区,按部首/笔画顺序排列。一级汉字是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。

汉字范围:B0A1-F7FE;第一字节0xB0-0xF7(对应区号:16-87),第二个字节0xA1-0xFE(对应位号:01-94)。字符范围:编码小于127的字符与ASCII编码相同。

GBK

1995年12月发布的汉字编码国家标准,是对GB2312编码的扩展,对汉字采用双字节编码。GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。

GBK的整体编码范围是为0x8140-0xFEFE,不包括低字节是0×7F的组合。高字节范围是0×81-0xFE,低字节范围是0x40-7E和0x80-0xFE。是0x40-0x7E的GBK字符有一定特殊性,因为这些字符占用了ASCII码的位置,这样会给一些系统带来麻烦。某些系统中用0x40-0x7E中的字符(如“ |”)做特殊符号,在定位这些符号时又没有判断这些符号是不是属于某个GBK字符的低字节,这样就会造成错误判断。在支持GB2312的环境下就不存在这个问题。需要注意的是支持GBK的环境中小于0x80的某个字节未必就是ASCII符号;另外就是最好替换小于0×40的ASCII符号做一些特殊符号,这样就可以快速定位,并且不用担心是某个汉字的另一半。中也存在相应问题。

GBK1830

2000年3月17日发布的汉字编码国家标准,是对GBK编码的扩展,覆盖中文,日文,朝鲜语和中国统一文字,其中收录27484个汉字。GB18030字符集采用单字节,双字节和四字节三种方式对字符编码。兼容GBK和GB2312字符集。

GB18030的单字节编码范围是0x00-0x7F,完全相等与ASCII;双字节编码的范围和GBK相同,高字节是0x81-0xFE,低字节的编码范围是0x40-0x7E和0x80-FE;四字节编码中第一,三字节的编码范围是0x81-0xFE,二,四字节是0x30-0x39。

BIG5​ 台湾地区繁体中文标准字符集,采用双字节编码,共收录13053个中文字,1984年实施。

Unicode编码

国际标准字符集,从而世界各种语言的每个字符定义一个唯一的编码,替代跨语言,跨平台的文本信息转换。

Unicode的最初目标,是用1个16位的编码来为超过65000个字符提供映射。而是还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题(尤其是植入性头痛),尤其是在那些基于网络的应用中。现有的软件必须做大量的工作来程序16位的数据。

因此,Unicode用一些基本的保留字符编制了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。称为名字,在UTF-8中,字符以8位序列来编码这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在UTF-8和ASCII中,“ A”的编码都是0x41。UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的,通常说的Unicode就是指UTF-16。在讨论Unicode时,搞清楚某种编码方式非常重要

UTF-8编码

Unicode转换格式8位,允许包含BOM,但通常不含BOM。是替换解决国际上字符的一种多字节编码,它对英语使用8位(即一个字节),中文使用24为(三UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。

如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器。


具体编码方式:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode编码。因此对于英语字母,UTF-8编码和ASCII码是相同的。2)对于n字节的符号(n> 1),第一个字节的前n位都设置1,第n + 1位设置0,后面字节的前一个一律被设置为10。其余的没有提及的二进制位,全部为这个符号的Unicode码。


Unicode符号范围               |        UTF-8编码方式
(十六进制) | (二进制)
-----------------------------+---------------------------------------------
1字节 (0x00000000~0x0000007f) | 0xxxxxxx(只占用8bit)
2字节 (0x00000080~0x000007ff) | 110xxxxx10xxxxxx(16bit)
3字节 (0x00000800~0x0000ffff) | 1110xxxx10xxxxxx10xxxxxx(24bit)
4字节 (0x00010000~0x001fffff) | 11110xxx10xxxxxx10xxxxxx10xxxxxx(32bit)
5字节 (0x00200000~0x03ffffff) | 111110xx10xxxxxx10xxxxxx10xxxxxx10xxxxxx(40bit)
6字节 (0x04000000~0x7fffffff) | 1111110x10xxxxxx10xxxxxx10xxxxxx10xxxxxx10xxxxxx10xxxxxx(48bit)

例如:“严” utf-8为e4b8a5


utf-8:1110 ​0100​ 10 ​111000​ 10 ​100101​ unicode:0b(0100 111000 100101)= 0b(0100 1110 0010 0101)= 0h(0x4e25)

unicode-> utf-8思路:

已知unicode判断其编码范围,得到为几字节编码(0x4e25> 0x80 && <0xffff,为3字节编码)

依次补上1110、10、10。


  1. unicode>>12|0xe0
  2. (unicode>>6&0x3f)|0x80
  3. unicode&0x3f|0x80


总结

GB2312:支持常见的汉字(6763)

GBK:是对GB2312的扩展(收录21003汉字)GB18030:是对GBK的补充(收录27484汉字)Unicode utf-8:是解决国际上字符的一种多字节编码。

GBK,GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:GBK,GB2312--Unicode--UTF8 UTF8--Unicode--GBK,GB2312