字符在计算机中是如何表示的?


如果计算机只存储二进制数据,那么它如何表示字符呢?计算机使用的是字符集,将字符映射为整数。早期,字符集只用 8 位表示。即使是现在,在字符模式(如 MS-DOS)下运行时,IBM 兼容微机使用的还是 ASCII(读为“askey”)字符集。

ASCII 是美国标准信息交换码(AmeTican Standard Code for Information Interchange)的首字母缩写。在 ASCII 中,每个字符都被分配了一个独一无二的 7 位整数。

由于 ASCII 只用字节中的低 7 位,因此最高位在不同计算机上被用于创建其专有字符集。比如,IBM 兼容微机就用数值 128〜255 来表示图形符号和希腊字符。

ANSI 字符集

美国国家标准协会(ANSI)定义了 8 位字符集来表示多达 256 个字符。前 128 个字符对应标准美国键盘上的字母和符号。后 128 个字符表示特殊字符,诸如国际字母表、重音符号、货币符号和分数。

Microsoft Windows 早期版本使用 ANSI 字符集。

Unicode 标准

当前,计算机必须能表示计算机软件中世界上各种各样的语言。因此,Unicode 被创建出来,用于提供一种定义文字和符号的通用方法。

Unicode 定义了数字代码(称为代码点(code point)),定义的对象为文字、符号以及所有主要语言中使用的标点符号,包括欧洲字母文字、中东的从右到左书写的文字和很多亚洲文字。代码点转换为可显示字符的格式有三种:
  • UTF-8 用于 HTML,与 ASCII 有相同的字节数值。
  • UTF-16 用于节约使用内存与高效访问字符相互平衡的环境中。比如,Microsoft Windows 近期版本使用了 UTF-16,其中的每个字符都有一个 16 位的编码。
  • UTF-32 用于不考虑空间,但需要固定宽度字符的环境中。每个字符都有一个 32 位的编码。

ASCII 字符串

有一个或多个字符的序列被称为字符串(string)。更具体地说,一个 ASCII 字符串是保存在内存中的,包含了 ASCII 代码的连续字节。比如,字符串“ABC123”的数字代码是 41h、42h、43h、31h、32h 和 33h。

以空字节结束(null-terminated)的字符串是指,在字符串的结尾处有一个为 0 的字节。C 和 C++ 语言使用的是以空字节结束的字符串,一些 Windows 操作系统函数也要求字符串使用这种格式。

使用 ASCII 表

下图中列出了在 Windows 控制台模式下运行时使用的 ASCII 码。

ASCII码表

在查找字符的十六进制 ASCII 码时,先沿着表格最上面一行,再找到包含要转换字符的列即可。表格第二行是该十六进制数值的最高位;左起第二列是最低位。

例如,要查找字母 a 的 ASCII 码,先找到包含该字母的列,在这一列第二行中找到第一个十六进制数字 6。然后,找到包含 a 的行的左起第二列,其数字为 1。因此,a 的 ASCII 码是十六进制数 61。

下图用简单的形式说明了这个过程:

ASCII 控制字符

0〜31 的字符代码被称为 ASCII 控制字符。若程序用这些代码编写标准输出(比如 C++ 中),控制字符就会执行预先定义的动作。下表列出了该范围内最常用的字符。

ASCII码(十进制) 说明 ASCII码(十进制) 说明
8 回退符(向左移动一列) 12 换页符(移动到下一个打印页)
9 水平制表符(向前跳过 n 列) 13 回车符(移动到最左边的输出列)
10 换行符(移动到下一个输出行) 27 换码符

数字数据表示术语

用精确的术语描述内存中和显示屏上的数字及字符是非常重要的。比如,在内存中用单字节保存十进制数 65,形式为 0100 0001。调试程序可能会将该字节显示为“41”,这个数字的十六进制形式。

如果这个字节复制到显存中,则显示屏上可能显示字母“A”,因为在 ASCII 码中,0100 0001 代表的是字母 A。由于数字的解释可以依赖于它的上下文,因此,下面为每个数据表示类型分配一个特定的名称,以便将来的讨论更加清晰:

二进制整数是指,以其原始格式保存在内存中的整数,以备用于计算。二进制整数保存形式为 8 位的倍数(如 8、16、32 或 64)。
数字字符串是一串 ASCII 字符,例如“123”或“65”。这是一种简单的数字表示法,下表以十进制数 65 为例,列出了这种表示法能使用的各种形式。

格式 数值 格式 数值
二进制数字字符串 “01000001” 十六进制数字字符串 “41”
十进制数字字符串 “65” 八进制数字字符串 “101”