常见的字符编码ascii、gb2312、utf-8和base64的规则
⽬录
常见的字符编码
本篇⽂章将对常见的字符编码进⾏介绍,并重点总结gb2312、utf-8和数字证书中常使⽤的编码。
ANSI
ANSI指American National Standards Institute(美国国家标准学会)。
ANSI 编码,⼜称为"MBCS(Muilti-Bytes Character Set,多字节字符集)"。ANSI编码不是⼀种具体的编码⽅式,⽽是⼀种指定在某些环境下使⽤某些编码⽅式的标准。⽐如,在中⽂环境中ANSI的编码标准为GBK,在⽇语环境中ANSI的编码标准则是Shift_JIS编码。
Windows系统中ANSI是根据当前系统区域(locale)来设置的,要想修改系统默认的“ANSI编码”,我们可以通过修改系统区域来实现(“控制⾯板” =>“时钟、语⾔和区域”=>“区域和语⾔”=>“管理”=>“更改系统区域设置...”)。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,⽆法将属于两种语⾔的⽂字,存储在同⼀段 ANSI 编码的⽂本中。⼀个很⼤的缺点是,同⼀个编码值,在不同的编码体系⾥代表着不同的字。这样就容易造成混乱。导致了unicode码的诞⽣。其中,每个语⾔下的ANSI编码,都有⼀套⼀对⼀的编码转换器,Unicode变成所有编码转换的中间介质。所有的编码都有⼀个转换器可以转换到Unicode,⽽Unicode也可以转换到其他所有的编码。
ASCII
美国(国家)信息交换标准(代)码,对应的 ISO 标准为 ISO646 标准。
标准 ASCII 码使⽤ 7 个⼆进位对字符进⾏编码,最多可以给256个字符(包括字母、数字、标点符号、控制字符及其他符号)分配(或指定)数值。
基本的 ASCII 字符集共有 128 个字符,其中有 95 个可打印字符,包括常⽤的字母、数字、标点符号等,另外还有 33 个控制字符。下表展⽰了基本 ASCII 字符集及其编码:
图
0~31及127(共33个)是控制字符或通信专⽤字符(其余为可显⽰字符),如控制符:LF(换⾏)、
CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通信专⽤字符:SOH(⽂头)、EOT(⽂尾)、ACK(确认)等;ASCII值为8、9、10和13分别转换为退格、制表、换⾏和回车字符。它们并没有特定的图形显⽰,但会依不同的应⽤程序⽽对⽂本显⽰有不同的影响。
32~126(共95个)是可打印字符,其中32为空格,48~57为0到9⼗个阿拉伯数字,65~90为26个⼤写英⽂字母,97~122为26个⼩写字母,其余为⼀些标点符号、运算符号等。
虽然标准 ASCII 码是 7 位编码,但由于计算机基本处理单位为字节( 1byte = 8bit ),所以⼀般仍以⼀个字节来存放⼀个 ASCII 字符。每⼀个字节中多余出来的⼀位(最⾼位)在计算机内部通常保持为 0 (在数据传输时可⽤作奇偶校验位)。
扩展 ASCII
码
由于标准 ASCII 字符集字符数⽬有限,在实际应⽤中往往⽆法满⾜要求。为此,国际标准化组织⼜制定了 ISO2022 标准,它规定了在保持与 ISO646 兼容的前提下将 ASCII 字符集扩充为 8 位代码的统⼀⽅法。
ISO 陆续制定了⼀批适⽤于不同地区的扩充 ASCII 字符集,每种扩充 ASCII 字符集分别可以扩充 128 个字符,这些扩充字符的编码均为⾼位为 1 的 8 位代码(即⼗进制数 128~255 ),称为扩展 ASCII 码。
Python3对ASCII码操作
GB2312
为了满⾜国内在计算机中使⽤汉字的需要,中国国家标准总局发布了⼀系列的汉字字符集国家标准编码,统称为GB码,或国标码。其中最有影响的是于1980年发布的《信息交换⽤汉字编码字符集 基本集》,标准号为GB 2312-1980,因其使⽤⾮常普遍,也常被通称为国标码。GB2312编码通⾏于我国内地;新加坡等地也采⽤此编码。⼏乎所有的中⽂系统和国际化的软件都⽀持GB2312。
GB2312 是ANSI编码⾥的⼀种,对ANSI编码最初始的ASCII编码进⾏扩充。
GB2312是⼀个简体中⽂字符集,由6763个常⽤汉字和682个全⾓的⾮汉字字符组成。其中汉字根据使⽤的频率分为两级。⼀级汉字3755个,⼆级汉字3008个。1
ord('a') # 获取ASCII 码数字2 3chr(127) # ASCII 码转为字符 返回'\x7f',说明backspace 不可打印
计算机中汉字的处理
计算机进⾏汉字信息处理时,使⽤了四种编码:汉字输⼊码、汉字内码(机内码)、汉字字形码、汉字交换码(国标码)。
1. 汉字输⼊码:输⼊码所解决的问题是如何使⽤西⽂标准键盘把汉字输⼊到计算机内。主要可以分为三类:数字编码(如区位码)、拼
⾳编码和字编型码(如五笔字形)。
2. 汉字内码:在设备和信息处理系统内部存储、处理、传输汉字时真正使⽤的代码。
3. 汉字字形码:表⽰汉字字形的字模数据,因此也称为字模码。与输⼊码相对应,是汉字的输出形式,通常以点阵、⽮量函数表⽰。
4. 汉字交换码:国标码只是定义了GB2312标准,并没有在机器中真正使⽤(笔者的理解)。
此外,区位码也是GB2312标准的⼀部分,定义了该标准,是国标码的另⼀种表现形式。
区位码
GB2312字符在计算机中存储是以其区位码为基础的,这是由于字符数量⽐较⼤,所以GB2312采⽤了⼆维矩阵编码法对所有字符进⾏编码。
⾸先构造⼀个94⾏94列的⽅阵,对每⼀⾏称为⼀个“区”,每⼀列称为⼀个“位”,然后将所有字符依照下表的规律填写到⽅阵中。其中,汉字的区码和位码分别占⼀个存储单元(⼀个字节),每个汉字占两个存储单元。
GB2312 字符编码分布表
分区范围符号类型
第01区中⽂标点、数学符号以及⼀些特殊字符
第02区各种各样的数学序号
第03区全⾓西⽂字符
第04区⽇⽂平假名
第05区⽇⽂⽚假名
第06区希腊字母表
第07区俄⽂字母表
第08区中⽂拼⾳字母表
第09区制表符号
第10-15区⽆字符
第16-55区⼀级汉字(以拼⾳字母排序)
第56-87区⼆级汉字(以部⾸笔画排序)
第88-94区⽆字符
这样所有的字符在⽅阵中都有⼀个唯⼀的位置,这个位置可以⽤区号、位号合成表⽰,称为字符的区位码。如第⼀个汉字“啊”出现在第16区的第01位上,其区位码为1601。因为区位码同字符的位置是完全对应的,因此区位码同字符之间也是⼀⼀对应的。这样所有的字符都可通过其区位码转换为数字编码信息。
GB2312双字节编码规则
GB2312规定对收录的每个字符采⽤两个字节表⽰,第⼀个字节为“⾼字节”,对应94个区;第⼆个字节
为“低字节”,对应94个位。GB2312编码(机内码)范围:A1A1-FEFE(对应区位码0101-9494)。其中,汉字编码范围:B0A1-F7FE,汉字编码:第⼀字节0xB0-0xF7(对应区号:16-87),第⼆个字节0xA1-0xFE(对应位号:01-94)。
举例来说,“啊”字是GB2312编码中的第⼀个汉字,它位于16区的01位,所以它的区位码就是1601。
三码转换
区位码:区号和位号分别加上0xA0就是机内码。
国标码:双字节每个字节分别加上0x80就是机内码,相当于把每个字节最⾼位置为1。
注:后缀H表明是⽤⼗六进制形式来表⽰的。
例如第⼀个码位(汉字“啊”)的区位码是1601,区号和位号分别转换成⼗六进制是1001H,转换过程如下:
区码10H转换:0x10+0xA0=0xB0
位码01H转换:0x01+0xA0=0xA1
所以该码位的GB2312编码是B0A1H。
扩展阅读:为什么有机内码,避免与西⽂冲突
由于区码和位码的取值范围都是在1-94之间,这样的范围同西⽂的存储表⽰冲突。
例如,汉字‘珀’在GB2312中的区位码为7174,其两字节表⽰形式为71,74;⽽两个西⽂字符‘G J’的存储码也是71, 74。这种冲突将导致在解释编码时到底表⽰的是⼀个汉字还是两个西⽂字符将⽆法判断。
为避免同西⽂的存储发⽣冲突,GB2312字符在进⾏存储时,通过将原来的每个字节第8bit设置为1同西⽂加以区别,如果第8bit为0,则表⽰西⽂字符,否则表⽰GB2312中的字符,这就产⽣了机内码。
上⾯是国标码转机内码的⽅式,实际存储时,直接将区位码转为机内码即可。将区位码的每个字节分别加上A0H(160)的⽅法转换为存储码,计算机存储规则是此编码的补码,⽽且是位码在前,区码在后。例如汉字‘啊’的区位码为1601,其存储码为B0A1H。
GBK
GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼⾳的第⼀个字母,英⽂名称:Chinese Internal Code Specification),中华⼈民共和国全国信息技术标准化技术委员会1995年12⽉1⽇制订,国家技术监督局标准化司、电⼦⼯业部科技与质量监督司1995年12⽉15⽇联合以技监标函1995 229号⽂件的形式,将它确定为技术规范指导性⽂件。这⼀版的GBK规范为1.0版。
承上启下
GBK 向下与 GB 2312 编码兼容,向上⽀持 ISO 10646.1国际标准,是前者向后者过渡过程中的⼀个承上启下的产物。
unicode汉字ISO 10646 是国际标准化组织 ISO 公布的⼀个编码标准,即 Universal Multilpe-Octet Coded Character Set(简称UCS),⼤陆译为《通⽤多⼋位编码字符集》,台湾译为《⼴⽤多⼋位元编码字元集》,它与 Unicode 组织的 Unicode 编码完全兼容。ISO 10646.1是该标准的第⼀部分《体系结构
与基本多⽂种平⾯》。我国 1993 年以 GB 13000.1 国家标准的形式予以认可(即 GB 13000.1 等同于ISO 10646.1)。
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编码⽅案。
扩展阅读:国家标准汉字编码发展史
由于ASCII编码不⽀持中⽂,因此,当中国⼈⽤到计算机时,就需要寻求⼀种编码⽅式来⽀持中⽂。
于是,国⼈就定义了⼀套编码规则:当字符⼩于127位时,与ASCII的字符相同,但当两个⼤于127的字符连接在⼀起时,就代表⼀个汉字,第⼀个字节称为⾼字节(从0xA1-0xF7),第⼆个字节为低字节(从0xA1-0xFE),这样⼤约可以组合7000多个简体汉字。这个规则叫做GB2312。
但是由于中国汉字很多,有些字⽆法表⽰,于是重新定义了规则:不在要求低字节⼀定是127之后的编
码,只要第⼀个字节是⼤于127,就固定表⽰这是⼀个汉字的开始,不管后⾯跟的是不是扩展字符集⾥的内容。这种扩展之后的编码⽅案称之为GBK标,包括了GB2312的所有内容,同时新增了近20000个新的汉字(包括繁体字)和符号。
但是,中国有56个民族,所以,我们再次对编码规则进⾏了扩展,⼜加了近⼏千个少数民族的字符,于是再次扩展后得编码叫做GB18030。
中国的程序员觉得这⼀系列编码的标准是⾮常的好,于是统统称他们叫做"DBCS"(Double Byte Charecter Set 双字节字符集)。
Big5
在台湾、⾹港与澳门地区,使⽤的是繁体中⽂字符集。⽽1980年发布的GB2312⾯向简体中⽂字符集,并不⽀持繁体汉字。在这些使⽤繁体中⽂字符集的地区,⼀度出现过很多不同⼚商提出的字符集编码,这些编码彼此互不兼容,造成了信息交流的困难。为统⼀繁体字符集编码,1984年,台湾五⼤⼚商宏碁、神通、佳佳、零壹以及⼤众⼀同制定了⼀种繁体中⽂编码⽅案,因其来源被称为五⼤码,英⽂写作Big5,后来按英⽂翻译回汉字后,普遍被称为⼤五码。
⼤五码是⼀种繁体中⽂汉字字符集,其中繁体汉字13053个,808个标点符号、希腊字母及特殊符号。
⼤五码的编码码表直接针对存储⽽设计,每个字符统⼀使⽤两个字节存储表⽰。第1字节范围81H-FEH,避开了同ASCII码的冲突,第2字节范围是40H-7EH和A1H -FEH。因为Big5的字符编码范围同GB2312字符的存储码范围存在冲突,所以在同⼀正⽂不能对两种字符集的字符同时⽀持。
Big5编码的分布如表1-5所⽰,Big5字符主要部分集中在三个段内:标点符号、希腊字母及特殊符号;常⽤汉字;⾮常⽤汉字。其余部分保留给其他⼚商⽀持。
Big5字符编码分布表
编码范围符号类别
8140H-A0FEH保留(⽤作造字区)
A140H-A3BFH标点符号、希腊字母及特殊符号
A3C0H-A3FEH保留(未开放⽤于造字区)
A440H-C67EH常⽤汉字(先按笔划,再按部⾸排序)
C6A1H-C8FEH保留(⽤作造字区)
C940H-F9D5H⾮常⽤汉字(先按笔划,再按部⾸排序)
F9D6H-FEFEH保留(⽤作造字区)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论