1078 字
5 分钟
Encode

字符编码#

字符编码的作用#

计算机内部,所有信息最终都是二进制的数字,而计算机内部存储的字符都是通过编码表映射出来的,为了能让我们熟知的字符正常显示在屏幕上,我们需要做以下两件事情:

  1. 给所有的字符一个独一无二的数字编号,做一个数字编号到汉字的 mapping 关系(即字符集)
  2. 把这个数字编号能用0和1表示出来

我们通常所说的 Unicode,其实只做了第1件事情,并且是给全世界所有语言的所有文字或字母一个独一无二的数字编码,这样只要设计一种机制做第2件事情来表示 Unicode,就可以显示全球范围内任何文字了。Unicode具体对所有语言的每个字母、文字的数字编号可以从其官方网站 Unicode 编码表 查询。

常见的字符编码#

root((字符编码类型))
((Unicode))
((ASCII))
((Latin1))
((GB2312))
((GBK))
((GB18030))
((UTF8))

ASCII#

ASCII 编码,全称是 American Standard Code for Information Interchange,美国信息交换标准代码。

ASCII编码每个字母或符号占1byte(8bits),并且8bits的最高位是0,因此ASCII能编码的字母和符号只有128个。有一些编码把8bits最高位为1的后128个值也编码上,使得1byte可以表示256个值,但是这属于扩展的ASCII,并非标准ASCII。通常所说的标准ASCII只有前128个值!

ASCII编码几乎被世界上所有编码所兼容(UTF16和UTF32是个例外),因此如果一个文本文档里面的内容全都由ASCII里面的字母或符号构成,那么不管你如何展示该文档的内容,都不可能出现乱码的情况。

ASCII编码

Latin1(又名ISO-8859-1编码)#

Latin1 在 ASCII 基础上又充分利用了后面那128个值,赋予他们一些泰语、希腊语等字母或符号,将1个字节的256个值全部占满了。 值得一提的是 MySQL 选它做默认编码。

GB2312#

GB 全称 GuoBiao(国标),GBK 全称 GuoBiaoKuozhan(国标扩展)。GB18030 编码兼容 GBK,GBK 兼容 GB2312,其实这三种编码有着非常深厚的渊源,我们放在一起进行介绍。

GB2312 是最早一版的中文编码,每个字占据 2bytes。由于要和 ASCII 兼容,那这 2bytes 最高位不可以为0了(否则和ASCII会有冲突)。在 GB2312 中收录了 6763 个简体汉字以及 682 个特殊符号,已经囊括了生活中最常用的所有汉字。

GBK#

由于 GB2312 只有 6763 个汉字,于是 GBK 中在保证不和 GB2312、ASCII 冲突的前提下,也用每个字占据 2bytes 的方式又编码了许多汉字。经过 GBK 编码后,可以表示的汉字达到了 20902 个,另有 984 个汉语标点符号、部首等。值得注意的是这 20902 个汉字还包含了繁体字,但是该繁体字与台湾Big5编码不兼容,因为同一个繁体字很可能在 GBK 和 Big5 中数字编码是不一样的。

GB18030#

然而,GBK的两万多字也已经无法满足我们的需求了,还有更多可能你自己从来没见过的汉字需要编码。

这时候显然只用2bytes表示一个字已经不够用了(2bytes最多只有65536种组合,然而为了和ASCII兼容,最高位不能为0就已经直接淘汰了一半的组合,只剩下3万多种组合无法满足全部汉字要求)。因此GB18030多出来的汉字使用4bytes编码。当然,为了兼容GBK,这个四字节的前两位显然不能与GBK冲突(实操中发现后两位也并没有和GBK冲突)。

我国在2000年和2005年分别颁布的两次GB18030编码,其中2005年的是在2000年基础上进一步补充。至此,GB18030编码的中文文件已经有七万多个汉字了,甚至包含了少数民族文字。

UTF8#

UTF8 全称 Unicode Transformation Format - 8-bit,是一种变长的编码方式。UTF8 可以表示出世界上所有的文字!伟大无需多言。

Encode
https://songbaicheng.cc.cd/posts/encode/
作者
宋柏成
发布于
2026-06-05
许可协议
CC BY-NC-SA 4.0