常见编码介绍
1.ASCII
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的系统,并等同于国际标准ISO/IEC 646。(百度百科)
2.GB2312
GB2312:中华民族传承下来的汉字怎么破?gb2312就这样来了,采用两个字节来编码,沿用ASCII中前127个字符的编码,127之后的字符全部去掉。两个字节中前一个称为高字节(oxA1-ox7),后一个为低字节(oxA1-oxFE),这样能组合映射出来7000多汉字,同时还把ASCII中前127个字符重新编码一次,被称为'全角',127以下称为'半角'。字符编码范围:16进制:0x0000-(中间有一部分是未使用的)-0xF7FE
对于ASCII字符集,编码不变,从0x00
~0x7F
.
GB2312中对所收汉字进行了“分区”处理,编号为01区至94区;每区含有94个字符,编号为01位至94位。这种表示方式也称为区位码。每一个字符都由与其唯一对应的区号和位号所确定。
例如:“啊”的编号为16区01位,它的区位码就是1601(可以认为这就是一个代码点)。
01–09区为特殊符号。
16–55区为一级汉字,按拼音排序。
56–87区为二级汉字,按部首/笔画排序。
举例来说,“啊”字是第16区中的第1个字符,它的区位码就是1601;“琛”字是第72区的第41个字符,它的区位码就是7241。
对非ASCII字符如何编码
GB2312的编码单元是8比特,刚好是一个字节。对于非ASCII字符,每个字符由2个编码单元组成。第一个编码单元称为“高位字节”,第二个编码单元称为“低位字节”。
高位字节 = 区号 + 0xA0
低位字节 = 位号 + 0xA0
举例:“啊”的区位码是1601,
高位字节 = 0x10(=16) + 0xA0 = 0xB0
低位字节 = 0x01(=1) + 0xA0 = 0xA1
所以,“啊”的编码就是0xB0(第一个编码单元)0xA1(第二个编码单元)。
再比如,“琛”的区位码是7241,
高位字节 = 0x48(=72) + 0xA0 = 0xE8
低位字节 = 0x29(=41) + 0xA0 = 0xC9
所以,“琛”的编码就是0xE8(第一个编码单元)0xC9(第二个编码单元)。
说明:“高位字节”使用了0xA1–0xF7(把01–87区的区号加上0xA0),“低位字节”使用了0xA1–0xFE(把01–94加上0xA0)。不管是高位字节还是低位字节,它们的最高位都是1,这样就可以和ASCII字符的编码区分开。
3.GBK
GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年10月制定, 1995年12月正式发布,目前中文版的WIN95、WIN98、WINDOWS NT以及WINDOWS 2000、WINDOWS XP、WIN 7等都支持GBK编码方案。
4.Unicode
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。UTF-8,UTF-16,UTF-32是三种不同的Unicode编码方式,这三种编码方式都用于编码U+0000
~U+D7FF
以及U+E000
~U+10FFFF
的Unicode代码点。
5.UTF-8
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节与 ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部分修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或发送文字的应用 中,优先采用的编码。
UTF-8编码规则:如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。UTF-8转换表表示如下: