1、背景
在计算机领域中,不管是存储还是传输,信息都是以二进制的形式。不管是音频、视频、图片等,都是通过特定的编码规则、标准将其转为二进制,然后进行存储或传输。对于“字符是如何以二进制形式表示并存储在计算机中”的问题在计算机领域开展比较早的工作,是计算机领域的一项基本问题,至今拥有十分完善的标准。
在实际的软件开发过程中,字符集与其编码所带来的问题是不可忽视的,出现“乱码”是最常见的问题。
所以在这里探讨一下有关“字符集与其编码”这一计算机领域的基础问题。
2、字符集与其编码的概述
大家都清楚,计算机是用来给人用的,那么既然是给人用的,那么就需要显示出人所能看懂的一些文字、符号等,但是人类的语言系统又是比较复杂的,所以,需要先对人类的语言进行整理,整理后的文字、符号等字符的所形成集合称之为“字符集(charset)”。
有了字符集之后,就要考虑如何将字符集中的文字、符号等字符放入计算机中存储,也就是需要将字符用二进制的0和1表示出来,从字符到二进制的过程,称为“编码”。一个字符集会采用相应的标准或规则对其中的字符进行编码,即一个字符集中的字符转换为二进制是有相应的标准或规则的。
综上所述,字符集与编码(也习惯叫“字符编码”)是两个概念。但是往往在现实中,字符集与其编码方式、规则会在一起以有名字的标准的形式向外发布,像 GBK 等,所以说在现实中并没有将这两个概念区分的非常清楚,说是 “GBK 字符集”、“GBK 编码”也行。
3、常见的字符集

在上图中,处在同一行的字符集是具有时间先后顺序的,左边的早于右边的;处在不同行的字符集,在绘制该图时,是没有时间顺序,并不是说处在上边的字符集发布的时间一定比处在下边的字符集早,会存在发布的时间相接近(例如:GBK 和 CP936)等情况。这个图中的4行,可以理解成是大致是4个体系。
梳理一下“字符集与编码”的发展历程:
第一阶段:ASCII 字符集与 ASCII 编码。
第二阶段:随着计算机在各个国家开始被使用,各个国家考虑如何将本国的语言能够在计算机存储,于是制定各自的标准。
第三阶段:随着互联网的发展,意识到需要在国际上有一个统一的标准。于是相关的国际组织起草并发布相关的标准(第三阶段所进行的工作实际上在第二阶段时候就已经开展)
4、ASCII
计算机起源于美国,所以说需要整理出一套字符集来满足美国人的需求,所以就有了 ASCII,至今仍在被使用。
ASCII 是 American Standard Code for Information Interchange 的缩写,意思是“美国信息交换标准代码”。是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语。
ASCII 字符集:主要包括控制字符(回车、退格、换行等);可显示字符(英文大小写字符、阿拉伯数字和西文符号)。该字符集共包含128个字符。
ASCII 字符集所采用的编码称为 ASCII 编码。是一种单字节编码,但是并没有将一个字节的8位全部使用而是使用了7位,最高位为0是用于校验。

后来,随着计算机的发展,计算机进入欧洲,欧洲的国家拥有自己的语言,为了满足欧洲一些国家的需要,在 ASCII 字符集的基础上进行扩展,形成了 EASCII 字符集,其中 E 是 Extended 的第一个字母,EASCII 字符集也被称为“扩展的 ASCII 字符集”。EASCII 字符集在 ASCII 字符集的基础上又增加了128个字符。EASCII 字符集共有256个字符。
之前说过,ASCII 字符集采用单字节编码,但是只使用了7位来编码,最高位为0来用于校验;EASCII 字符集也是采用单字节编码,但是8位将全部用于编码,最高位是0的仍是原来的 ASCII 编码,最高位是1的用来编码新增的128个字符。

一般情况下,很少去使用 EASCII 字符集或 EASCII 编码的说法,都是用 ASCII 字符集或 ASCII 编码来直接代替。
ASCII 字符集及 ASCII 编码可以认为是计算机领域在字符这一方面最早的标准。
5、中文字符集及其编码
随着计算机进入中国,那么势必需要计算机来支持中文语言,于是,我国以及世界上的相关组织、厂商等便开始对中文的字符集以及其编码开展研究。
到目前为止,常见的字符集有 GB2312、GBK、CP932、GB18030。
GB2312
GB2312 也称 GB2312-1980、《信息交换用汉字编码字符集基本集》。由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准。
GB2312 中有汉字字符6763个,非汉字图形字符682个(包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符)。
GB2312 最常用的编码是 EUC-CN,为了兼容原始的 ASCII。

GBK
GBK 全称是《汉字内码扩展规范》,K 是“扩展”的“扩”字汉语拼音的第一个字母。中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订,国家技术监督局标准化司、电子工业部科技与质量监督司1995年12月15日联合以技监标函1995 229号文件的形式,将它确定为技术规范指导性文件。这一版的GBK规范为1.0版。
GBK 兼容 GB2312。收录了21003个汉字,支持繁体中文等。
GBK 并非正式的国家标准,是一个过渡方案。
CP936
由微软提出的,与 GBK 很相似,也是1995年提出的。
时至今日,微软的 Windows 系统的中文版本所采用默认编码仍是 CP936(或者直接就叫 GBK)。
GB18030
GB18030 分别于2000年和2005年发布过两次版本,2000年发布版本为GB18030-2000,2005年发布的版本为GB18030-2005。
GB18030-2005 可以认为是目前中文字符集与编码领域最完善的国家标准。
总结
我国在制定与“中文字符集与编码”相关的标准、规则的同时,国际上的一些标准化组织、包括像一些厂商也有一些与“中文字符集与编码”相关的标准发布。在这个过程中,我国制定的一些标准除了要考虑兼容已有的国家标准,也会考虑兼容国际标准。
上面所提到的 GB2312、GBK 等,从狭义上讲可以说是字符集,但是 GB 的含义是“国家标准”,标准是一套解决方案,囊括了字符集以及编码的规则等,所以说,像“GBK 编码”、“CP936 编码”等说法也是无可厚非的。
6、Unicode
随着计算机在全世界普及,为了使计算机能够适合当地的语言,设计和实现了很多字符集以及编码规则,但是,随着互联网时代到来,如果国际上没有一个统一的标准,那么就可能会在相互访问时引发乱码的现象。为了在国际上针对字符有一个统一的标准,Unicode 便应运而生,Unicode 字符集可以说是囊括了世界上所有的国家所需要的字符,并且现在还在不断扩充。
Unicode 准确地讲应该被称作标准,狭义上 Unicode 是一个字符集。所谓的标准,就是一个完整的解决方案,从字符集到怎么编码等问题都囊括在其中。
Unicode 又称“万国码”、“统一码”等,是当今计算机科学领域一项重要的标准。
Unicode 字符集常见的编码方式有 UTF-32、UTF-16、UTF-8 等。

7、字符集与编码的现实意义
- 防止乱码,包括要注意源文件的编码要统一等。
8、参考
如有不妥之处,请指出,本文仅代表本人对字符集和编码这一块的理解。
[1] 非常详细的字符编码讲解,ASCII、GB2312、GBK、Unicode、UTF-8等知识点都有 B站
[2] 为什么会有乱码?彻底搞懂编码问题【编程修炼之道】B站
[3] 字符集和字符编码(Charset & Encoding)博客园
[4] Unicode 百度百科
[5] GB2312 百度百科
[6] GBK 百度百科
[7] GB18030 百度百科
