一文看懂字符编码 - Unicode、UTF8、GBK、GB2312、ANSI和ASCII
前言
ASCII、ANSI、GB2312、GBK、UTF8 和 Unicode 是字符代码的几种不同编码格式。它们之间的区别与联系,大家一定很感兴趣,今天兔子先生就带大家一探究竟。
开始本章之前,有必要回顾一下,二进制与十六进制的对照关系:
二进制 | 十六进制 |
---|---|
0000 | 0x0 |
0001 | 0x1 |
0010 | 0x2 |
0011 | 0x3 |
0100 | 0x4 |
0101 | 0x5 |
0110 | 0x6 |
0111 | 0x7 |
1000 | 0x8 |
1001 | 0x9 |
1010 | 0xA |
1011 | 0xB |
1100 | 0xC |
1101 | 0xD |
1110 | 0xE |
1111 | 0xF |
ASCII
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。
它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。
标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符,总共为128个。
有几个比较特殊:
二进制 | 字符 | 说明 |
---|---|---|
0000 0000 | NUL | 空字符 |
0010 0000 | (space) | 空格键 |
0011 0000 | 0 | 字符0 |
0110 0001 | a | 字符a |
0111 1111 | DEL (delete) | 删除 |
ANSI
为了使计算机支持多种语言,不同的国家和地区制定了不同的标准。
ANSI表示英文字符时用一个字节,表示中文用两个字节
由此产生了 GB2312, BIG5, JIS 等各自的编码标准。简体中文系统下,ANSI 编码可以是 GB2312 或者 GBK 编码,在日文操作系统下 ANSI 编码代表 JIS 编码,而韩文系统中 ANSI 编码其实是 EUC-KR 编码。
GB2312
GB2312 编码,就是在 ASCII 编码的基础上进行扩充的,它规定如下:
ASCII 的字符完整地包含在GB2312里,编码不变,仍然是以0开头,用一个字节来表示一个字符;对于ASCII没有的字符,就用1开头来区分,用两个字节合起来表示一个字符。
这样,在解码的时候,遇到字节是以0开头的,就知道这一个字节就表示了一个字符;遇到字节是以1开头的,就知道要加上下一个字节合起来表示一个字符。这样就在 GB2312 中既把ASCII的字符包含了进来,又能将它们区分出来,能达到兼容的效果了
我们以 字符ABC 这句话为例子,它的 GB2312 编码情况如下
二进制 | 16进制 | 字符 |
---|---|---|
11010111 11010110 | 0xD7D6 | 字 |
11000100 10111000 | 0xC4B8 | 母 |
01000001 | 0x41 | A |
01000002 | 0x42 | B |
01000003 | 0x43 | C |
GBK
GBK 即汉字内码扩展规范,其中 K 为汉语拼音扩展中扩字的声母。共收入 21886 个汉字和图形符号,包括:
- GB 2312 中的全部汉字、非汉字符号。
- BIG5 中的全部汉字。
- 与 ISO 10646 相应的国家标准 GB 13000 中的其它 CJK 汉字,以上合计 20902 个汉字。
- 其它汉字、部首、符号,共计 984 个。
GBK 向下与 GB 2312 完全兼容,向上支持 ISO 10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。
Unicode
由于世界国家众多,语言差别也很大。ISO(国际标准化组织)决定定义一套编码方案来解决所有国家的编码问题。ISO对Unicode编码规定如下:
每个字符必须使用两个字节,即用16位二进制来表示所有的字符,对于ASCII编码表里的字符,保持其编码不变,只是将长度扩展到了16位,其他国家的字符全部统一重新编码。
由于传输ASCII表里的字符时,实际上可以只用一个字节就可以表示,所以,这种编码方案在传输数据比较浪费带宽,存储数据比较浪费硬盘。
UTF-8
由于 Unicode 比较浪费网络带宽和硬盘,为了解决这个问题,就在Unicode的基础上,定义了一套编码规则,这个新的编码规则就是UTF-8(Universal Character Set/Unicode Transformation Format - 8),采用1-4个字符进行传输和存储数据。
UTF-8区分每个字符的开始是根据字符的高位字节来区分的,方式如下表:
二进制 | 表达字符所需字节数 |
---|---|
0xxxxxxx | 一个字节 |
110xxxxx 10xxxxxx | 二个字节 |
1110xxxx 10xxxxxx 10xxxxxx | 三个字节 |
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 四个字节 |
对比
ANSI、UTF-8、Unicode为字符代码的三种编码格式,一个字符可以被编码成ANSI、UTF-8或Unicode格式,这三种格式只是表现形式不一样,其表示内容是一样的。如下表:
中文字符 | ANSI(GBK) | Unicode | UTF-8 |
---|---|---|---|
中 | 0xD6D0 | 0x4E2D | 0xE4B8AD |
更多内容
原文来自兔子先生网站:https://www.xtuz.net/detail-133.html
查看原文 >>> 一文看懂字符编码 - Unicode、UTF8、GBK、GB2312、ANSI和ASCII
如果你对Python语言感兴趣,可以关注我,或者关注我的微信公众号:xtuz666