计算机中非常基础且重要的概念:字符集(Character Set)与字符编码(Character Encoding),并重点介绍 ASCII 和 GBK。
1. 为什么需要字符集和编码?
要理解这一切,首先要记住一个核心事实:计算机只认识数字0和1。
我们人类在屏幕上看到的文字、符号(比如 'A', '好', '!')对计算机来说,本质上都是一串二进制的0和1。那么,如何将人类的字符与计算机的二进制数字对应起来呢?
这就需要一个“翻译”规则。这个规则分为两步:
- 字符集 (Character Set):先确定我们要用哪些字符。把所有需要用到的字符(比如所有英文字母、所有汉字、所有标点符号)收集起来,形成一个巨大的集合。这个集合就是“字符集”。
- 字符编码 (Character Encoding):为字符集中的每一个字符分配一个唯一的数字编号。这个“编号”的过程就是“编码”。计算机在存储和传输时,实际上操作的是这些数字编号,而不是字符本身。
通常我们把“字符集”和“字符编码”合在一起说,比如我们说“ASCII编码”,其实它既定义了字符的集合,也定义了这些字符对应的编号。
2. ASCII (美国信息交换标准代码)
ASCII (American Standard Code for Information Interchange) 是计算机世界里最早、最基础的编码规范。
- 诞生背景:诞生于上世纪60年代的美国,当时的计算机主要用于处理英文信息。
- 编码方式:ASCII 使用 7个比特位 (bit) 来表示一个字符。
- 我们知道,一个比特位有0和1两种状态,所以7个比特位可以表示 $2^7 = 128$ 个不同的字符。
- 在计算机中,通常以字节(Byte)为单位存储,1字节 = 8比特。所以 ASCII 字符在存储时,虽然只用了7位,但通常会占用一个完整的字节,最高位(第8位)统一为0。
- 包含内容:这128个位置(从0到127)都分配给了谁呢?
- 0-31 及 127:这些是控制字符或不可见字符。它们不是用来显示的,而是用来控制设备行为的,比如:
10 (\\\\n):换行符
9 (\\\\t):制表符 (Tab)
8:退格键 (Backspace)
- 32-126:这些是可打印字符,就是我们能在键盘上直接敲出来的字符,包括:
- 大小写英文字母 (
A-Z, a-z)
- 阿拉伯数字 (
0-9)
- 各种标点符号和运算符 (如
!, @, #, +, , , / 等)
- 空格 (
32)
ASCII 的局限性
ASCII 的最大问题在于它只能表示128个字符。这对于英语世界来说是足够的,但对于其他语言,比如中文、法文(带音标的字母)、俄文等,是远远不够的。一个汉字就有成千上万个,ASCII 完全无法表示。
3. GBK (汉字内码扩展规范)
为了解决 ASCII 无法显示中文的问题,中国制定了一系列自己的编码标准,GBK 就是其中最重要和最广泛使用的一个。
- 发展历程:
- GB2312 (1980年):这是最早的简体中文编码标准。它收录了约6763个汉字和一些符号。GB2312 规定,一个汉字用 2个字节 (16比特) 来表示。同时,为了兼容 ASCII,它做了一个巧妙的设计:
- 如果一个字节的最高位是
0,那么它就是 ASCII 字符,按 ASCII 的方式解析。
- 如果一个字节的最高位是
1,那么就意味着这是一个汉字的开始,需要再读取后面一个字节,将两个字节合在一起解析成一个汉字。
- 缺点:GB2312 收录的汉字不够全,很多生僻字、繁体字,甚至一些常用的人名用字(如朱镕基的“镕”)都没有包含。
- GBK (1995年):全称是《汉字内码扩展规范》(Guo Biao Kuozhan)。"K" 代表“扩展”。
- 完全兼容 GB2312:所有 GB2312 的编码在 GBK 中完全一样。
- 巨大扩展:GBK 在 GB2312 的基础上,大幅增加了字符数量,收录了超过21000个汉字,包括了简体、繁体汉字,以及日文、韩文中的一些汉字。
- 编码方式:GBK 继承了 GB2312 的思想,采用可变长编码:
- 单字节字符:对于 ASCII 码范围内的字符 (0-127),完全沿用 ASCII 的编码,只用一个字节表示。这保证了英文和数字的兼容性。
- 双字节字符:对于汉字和其他符号,使用两个字节表示。它的编码范围比 GB2312 更大,通过这种方式容纳了更多的字符。