字符集和编码

5次阅读

共计 2876 个字符,预计需要花费 8 分钟才能阅读完成。

字符集是什么
字符集 Charset:是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。——看的是不是想打人

举个栗子,现在这张表你把红色的盖住,只看蓝色的,他就是个 ASCII 字符集。不过现在是 10 进制的,真正的存储到电脑中是要转成二进制的。
有的同学可能要问了,我只看蓝色的,全都是数字,我怎么知道你那个数字要表达的是什么意思。
现在你在把盖住的红色的内容打开,他就变成了 ascii 码对照表。它就表示了 ascii 字符集与计算机二进制之间的对应关系。这种自然语言的字符与二进制数之间的对应规则叫做字符编码。


编码是什么
编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。
– 来自百度百科
解码是一种用特定方法,把数码还原成它所代表的内容或将电脉冲信号、光信号、无线电波等转换成它所代表的信息、数据等的过程。
– 来自百度百科(

继续上边的例子,现在 ascii 字符集与计算机语言之间的对应关系已经存在了。计算机中把从其他字符翻译成计算机中的二进制叫做编码(例如:ASCII 码对照表中,a 对应的是 73,人类输入 a,保存到计算机中,被翻译成了二进制的 97,这个过程叫编码)。
反过来计算机保存的 ”0110 0001″ 也就是十进制的 97,显示在你的显示屏幕上的时候是根据 ASCII 码对照表反向翻译过的,这个过程叫解码。
如果按照 A 规则存储,同样按照 A 规则解析,那么就能显示正确的文本符号。反之,按照 A 规则存储,再按照 B 规则解析,就会导致乱码现象。(A 规则可以理解成 ASCII 对应关系,b 规则理解为 utf- 编码)


字符集的发展史
ASCII 字符集:
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)。
基本的 ASCII 字符集,使用 7 位(bits)表示一个字符,共 128 字符。ASCII 的扩展字符集使用 8 位(bits)表示一个字符,共 256 字符,方便支持欧洲常用字符。
ISO-8859- 1 字符集:
拉丁码表,别名 Latin-1,用于显示欧洲使用的语言,包括荷兰、丹麦、德语、意大利语、西班牙语等。
ISO-5559- 1 使用单字节编码,兼容 ASCII 编码。
GBxxx 字符集:
GB 就是国标的意思,是为了显示中文而设计的一套字符集。
GB2312:简体中文码表。一个小于 127 的字符的意义与原来相同。但两个大于 127 的字符连在一起时,就表示一个汉字,这样大约可以组合了包含 7000 多个简体汉字,此外数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的 ” 全角 ” 字符,而原来在 127 号以下的那些就叫 ” 半角 ” 字符了。
GBK:最常用的中文码表。是在 GB2312 标准基础上的扩展规范,使用了双字节编码方案,共收录了 21003 个汉字,完全兼容 GB2312 标准,同时支持繁体汉字以及日韩汉字等。
GB18030:最新的中文码表。收录汉字 70244 个,采用多字节编码,每个字可以由 1 个、2 个或 4 个字节组成。支持中国国内少数民族的文字,同时支持繁体汉字以及日韩汉字等。
Unicode 字符集:
Unicode 编码系统为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码。
它最多使用 4 个字节的数字来表达每个字母、符号,或者文字。有三种编码方案,UTF-8、UTF-16 和 UTF-32。最为常用的 UTF- 8 编码。
1. 128 个 US-ASCII 字符,只需一个字节编码。
2. 拉丁文等字符,需要二个字节编码。
3. 大部分常用字(含中文),使用三个字节编码。
4. 其他极少使用的 Unicode 辅助字符,使用四字节编码。

(ASCII:简单的说就是美国发明了计算机之后,用 7 位(bits)表示一个字符,来表达自己语言的文字,一个字节是 8 位,还空了一位,最高位被置为 0。然后国际商业机器公司又加入了一些扩展,比如音标什么的,这下把 8 位全用上了。ISO-8859-1:欧洲其他国家用电脑的时候发现全是英语,你让我们这些母语不是英语的人怎么办, 于是制定了 ISO-8859- 1 字符集,兼容 ASCII 编码(比如 ASCII 中 97 表达的是是小写的 a,ISO-8859- 1 中 97 依然是小写的 a,ISO-8859- 1 没有修改 ASCII 原来的字符集,只是在你的基础上扩展)。GBxxx:GB2312:终于,计算机传到中国了。美国人发明的 ascii 码,只要表达大小写 26 个字母,加上些字符就行了,但是中国的汉字很多,无法用 1 字节也就是八位标识,所以当时就制定了 GB2312,规定了每个字占据 2bytes。由于要和 ASCII 兼容,那这 2bytes 最高位不可以为 0 了(否则和 ASCII 会有冲突)。GBK:之前只知道中国汉字多,但是没有想到这么多啊,原来规定汉子和计算机语言对应关系的时候,漏掉了好多汉字,所以在 GB2312 的基础上做了个扩展。GB18030:后来发现中国的汉字确实很多,上次的 GBK 依然有漏掉的汉字。那就继续加吧,不过这次扩展的时候又遇到了新的问题:2 字节一共才 16 位,最多才能表达 65535 个汉字,为了不跟 ASCII 冲突最高位又不能用,这下最多只能规定 3 万多了。因此 GB18030 多出来的汉字使用 4bytes 编码。当然,为了兼容 GBK,这个四字节的前两位显然不能与 GBK 冲突。Unicode: 统一各个国家所有文字的编码,Unicode 应运而生,最多使用 4 个字节的数字来表达每个字符。)
字符集和字符编码那点事
计算机要准确的存储和识别各种字符集符号,需要进行字符编码,一套字符集必然至少有一套字符编码。等等,一套字符集必然至少有一套字符编码,那岂不是……没错,每套字符集可能会有多个字符编码,就像这样

这是什么意思哪,其实也很好理解,就是字符集是固定的,比如现在有一套字符集,只有小写的 26 个字母。A 在编写对应规则的时候把 97 对应 a(ascii),但是 B 在编写的时候非要把计算机中的 98 对应 a。这就是同样的字符集,我用不同的对应规则去翻译成计算机的语言,翻译成的计算机序言肯定不是一样的。但是 utf- 8 和 utf-16、utf-32,并没有改变对应规则,只是改变了在计算机中的存储长度。还记得上边说过的 Unicode 最多只能存四个字节吗,这就意味着,Unicode 中不同的字符可以用 1 个、2 个、3 个或者 4 个字节保存。UTF-16 就是任何字符对应的数字都用两个字节来保存。UTF- 8 时表示一个字符是可变的, 有可能是用一个字节表示一个字符, 也可能是两个, 三个. 当然最多不能超过 3 个字节。UTF-32 就是把所有的字符都用 32bit 也就是 4 个字节来表示。当指定了编码,它所对应的字符集自然就指定了

正文完
 0