计算机编码ASCII、GBK、Unicode、UTF-8和URL编码的区别


计算机编码ASCII、GBK、Unicode、UTF-8和URL编码的区别

文章插图
 
【计算机编码ASCII、GBK、Unicode、UTF-8和URL编码的区别】在计算机中,所有的数据在存储和运算时都要使用二进制数值表示(因为计算机用高电平和低电平分别表示1和0),而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,这就是统一编码的原因 。简单来说编码就是字符与数值的对应关系 。下面我们详细介绍不同编码的编码规则和应用 。
ASCII编码ASCII码是由美国有关的标准化组织出台的,后来它被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,称为ISO 646标准 。该标准统一规定了常用字符(像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如:%、!、+等)总共128个字符)如何用二进制数来表示 。ASCII分为标准ASCII 码使用7 位二进制数组合来表示128种字符和扩展ASCII的8 位二进制数组合来表示256种字符 。
  • 标准ASCII
0-127所包含的码称为标准ASCII编码,如:空格SPACE是32(二进制00100000),大写的字母a是97(二进制01100001) 。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节(8位)的后7位,最前面的一位统一规定为0 。
下面是标准ASCII码表:
计算机编码ASCII、GBK、Unicode、UTF-8和URL编码的区别

文章插图
 
  • 扩展ASCII码
后128个称为扩展ASCII码 。扩展ASCII码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号;
下面是扩展ASCII码表:
计算机编码ASCII、GBK、Unicode、UTF-8和URL编码的区别

文章插图
 
在Python中可以使用内置函数ord()查看单个字符的ASCII码,例如:
>>> ord('a')97ord() 函数实质是返回字符的 Unicode 码对应的十进制数值 。例如
>>> ord("国")22269另外,ord()逆函数chr()查看编码对应的字符,例如:
>>> chr(97)'a'>>> chr(22269)'国'GBK由于ASCII编码是不支持中文的,但又需要寻求一种编码方式来支持中文 。于是,国人就定义了一套编码规则:当字符小于127位时,与ASCII的字符相同,但当两个大于127的字符连接在一起时,就代表一个汉字,第一个字节称为高字节(从0xA1-0xF7),第二个字节为低字节(从0xA1-0xFE),这样大约可以组合7000多个简体汉字 。这个规则叫做GB2312 。
由于中国汉字很多,有些字还是无法表示,于是重新定义了规则:不在要求低字节一定是127之后的编码,只要第一个字节是大于127,就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容 。这种扩展之后的编码方案称之为GBK,包含了GB2312的所有内容,同时新增了近20000个新的汉字(包括繁体字)和符号 。但是,中国有56个民族,每个民族都有自己的文字,所以,对GBK编码规则进行了扩展,又加了近几千个少数民族的字符,再次扩展后得编码叫做GB18030,GBK字符是被包含在GB18030字符内的,与GBK基本向后兼容 。GB18030共收录汉字70,244个.
Python中使用gbk和gb18030编码'韩'字:
>>> "韩".encode("gb18030")b'\xba\xab'>>> "韩".encode("gbk")b'\xba\xab'ANSI:为使计算机支持更多的语言,通常使用 0x80~0xFFFF 范围内的2个字节来表示1个字符 。比如:汉字 '中' 在中文操作系统中,使用0xD6、0xD0这两个字节存储 。但不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准 。这些使用多个字节来代表一个字符的各种延伸编码方式,被称为 ANSI 编码 。在简体中文windows操作系统为中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;而在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码 。不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中 。ANSI编码表示英文字符时用一个字节,表示中文用两个或四个字节 。
Unicode因为世界上有很多国家,而每个国家都定义一套自己的编码标准,结果相互之间无法解析编码进行通信,所以ISO(国际标准化组织)决定定义一套编码方案来解决所有国家的编码问题,这个新的编码方案就叫做Unicode 。注意Unicode不是一个新的编码规则,而是一套字符集(为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)),可以将Unicode理解为一本世界编码的字典 。具体的符号对应表,可以查询,或者专门的汉字对应表 。


推荐阅读