首页 > 技术文章 > 一文看懂字符编码 - Unicode、UTF8、GBK、GB2312、ANSI和ASCII

xtuz 2020-03-09 13:16 原文

前言

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

推荐阅读