汉字的编码体系主要有以下几种:

1、国标、区位“准国标”国标是将七千余个汉字以及标点符号、外文字母等,排成一个94行、94列的方阵。方阵中每一横行称为一个“区”,每个区有94个“位”。一个汉字在方阵中的坐标,称为该字的区位码;

2、GBK码,GB码的扩展字符编码,对多达两万多的简繁汉字进行了编码;

3、BIG5码,针对繁体汉字的汉字编码;

4、HZ码,HZ码是在Internet上广泛使用的一种汉字编码,它是以“纯国标”的中文与美标码混用为方案;

5、UCS和ISO,10646UCS是由ISO 10646定义的,是其他字符集标准的一个超集,保证与其他字符集是双向兼容的,它包含了所有已知语言的字符;

6、Unicode提供一种统一的字符标识方法,它是16位编码的,具备世界各地计算机与出版行业所用字符的全部代码。而且它的产生是以各个国家或国标字符编码为基础的。

这篇教程会帮你梳理清楚各种编码规则是怎么来的,让你对计算机的编码有个全方位认知。

我们常用的编码大概有这么几种, ASCII,GBK, GB2312,UTF8,UTF16,UTF32

ASCII

计算机问世开始,大家都用的 ascii 编码格式,定义为 8 个字节,且首字节恒定为0,因此最多可以表示 128 种字符

GB2312

ascii 虽然可以很好地表示英文,(毕竟英文一共只有26个字母),但是对于中国用户来说,ascii 编码方式肯定是无法支持所有汉字的,因此中国政府推出另一套编码规范,由中国国家标准总局1980年发布,1981年5月1日开始使用。

GB2312规定对收录的每个字符采用两个字节表示,第一个字节为“高字节”,对应94个区;第二个字节为“低字节”,对应94个位置。所以它的区位码范围是:0101-9494。区号和位号分别加上0xA0就是GB2312编码(因为限定最大区位码是 9494,因此不会造成区码位加上 0xA0 之后产生了问题)。例如最后一个码位是9494,区号和位号分别转换成十六进制是5E5E,0x5E+0xA0=0xFE,所以该码位的GB2312编码是FEFE。

GB2312编码范围:A1A1-FEFE,其中汉字的编码范围为B0A1-F7FE,第一字节0xB0-0xF7(对应区号:16-87),第二个字节0xA1-0xFE(对应位号:01-94)

从另一个角度理解中文编码为: 一个字节编码如果小于等于127,那么它的含义和 ascii编码一样,但是两个大于 127 的字节码拼接在一起的时候,可以表示某个汉字。前面的一个字节(称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。

GBK

由于GB 2312-80只收录6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如"啰"),部分人名用字,台湾及香港使用的繁体字,日语及朝鲜语汉字等,并未有收录在内。于是厂商微软利用GB 2312-80未使用的编码空间,收录GB 13000.1-93全部字符制定了GBK编码。根据微软资料,GBK是对GB2312-80的扩展,也就是CP936字码表 (Code Page 936)的扩展(之前CP936和GB 2312-80一模一样),最早实现于Windows 95简体中文版。虽然GBK收录GB 13000.1-93的全部字符,但编码方式并不相同。GBK自身并非国家标准,只是曾由国家技术监督局标准化司、电子工业部科技与质量监督司公布为"技术规范指导性文件"。原始GB13000一直未被业界采用,后续国家标准GB18030技术上兼容GBK而非GB13000。

GB18030

GB 18030,全称:国家标准GB 18030-2005《信息技术 中文编码字符集》,是中华人民共和国现时最新的内码字集,是GB 18030-2000《信息技术 信息交换用汉字编码字符集 基本资料的扩充》的修订版。与GB 2312-1980完全兼容,与GBK基本兼容,支持GB 13000及Unicode的全部统一汉字,共收录汉字70244个。

Unicode

从上面可以看出,不同的国家都在尝试制定自己的编码规范,那么这就会增加跨国沟通的成本。 因此 unicode 的主要思想是可以给世界上所有的字符,都定义一个唯一标识,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字严。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。

可以理解 Unicode 是一个思路,但是却不够实用。 因为当我们将一篇文章转换成 unicode 编码之后, 会返现不可读。 原因在于有些字符用一个字节表示,有些字符用两个字节表示,有的甚至更多,我们永远无法知道,对于一个字节来说,它表示的是一个独立字符还是某个字符的组成部分。

因为 unicode 最大编码是4个字节,过去为了使用 unicode 编码,只能在小于四字节编码的符号之前,用0补齐,凑成四字节,但是存储开销也随之增大不少。

UTF8 (Unicode 编码的一种实现)

UTF8 的出现很好地解决了 unicode 中间编码不可读的问题,定义了两条规则如下:

对于单字节的符号:字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的;

对于n字节的符号(n > 1):第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),不过在互联网上基本不用。

这里有些有趣的规则值得我们注意:

字节开头为0的,一定表示 ascii 编码

字节开头是10的,一定是某个字符的组成部分

字节开头是110 的(范围: 0xC0 ~ 0xDF),一定代表了双字节编码的开头,后面一定是一个 10 开头的字节

字节开头是 1110 的 (范围: 0xE0 ~ 0xEF),一定是代表了三字节编码的开头,后面一定是两个 10 开头的字节

在这么一套规则下,计算器可以很容易知道每个字节代表什么含义,是几个字符的编码,应该如何将字节组合编码。

关键词: 汉字编码 汉字编码有哪些 汉字四位数字编码查询 数字编码