如果计算机只存储二进制数据,那么它如何表示字符呢?计算机使用的是字符集,将字符映射为整数。早期,字符集只用 8 位表示。即使是现在,在字符模式(如 MS-DOS)下运行时,IBM 兼容微机使用的还是 ASCII(读为“askey”)字符集。
ASCII 是美国标准信息交换码(AmeTican Standard Code for Information Interchange)的首字母缩写。在 ASCII 中,每个字符都被分配了一个独一无二的 7 位整数。
由于 ASCII 只用字节中的低 7 位,因此最高位在不同计算机上被用于创建其专有字符集。比如,IBM 兼容微机就用数值 128〜255 来表示图形符号和希腊字符。
美国国家标准协会(ANSI)定义了 8 位字符集来表示多达 256 个字符。前 128 个字符对应标准美国键盘上的字母和符号。后 128 个字符表示特殊字符,诸如国际字母表、重音符号、货币符号和分数。
Microsoft Windows 早期版本使用 ANSI 字符集。
当前,计算机必须能表示计算机软件中世界上各种各样的语言。因此,Unicode 被创建出来,用于提供一种定义文字和符号的通用方法。
Unicode 定义了数字代码(称为代码点(code point)),定义的对象为文字、符号以及所有主要语言中使用的标点符号,包括欧洲字母文字、中东的从右到左书写的文字和很多亚洲文字。代码点转换为可显示字符的格式有三种:
有一个或多个字符的序列被称为字符串(string)。更具体地说,一个 ASCII 字符串是保存在内存中的,包含了 ASCII 代码的连续字节。比如,字符串“ABC123”的数字代码是 41h、42h、43h、31h、32h 和 33h。
以空字节结束(null-terminated)的字符串是指,在字符串的结尾处有一个为 0 的字节。C 和 C++ 语言使用的是以空字节结束的字符串,一些 Windows 操作系统函数也要求字符串使用这种格式。
下图中列出了在 Windows 控制台模式下运行时使用的 ASCII 码。
在查找字符的十六进制 ASCII 码时,先沿着表格最上面一行,再找到包含要转换字符的列即可。表格第二行是该十六进制数值的最高位;左起第二列是最低位。
例如,要查找字母 a 的 ASCII 码,先找到包含该字母的列,在这一列第二行中找到第一个十六进制数字 6。然后,找到包含 a 的行的左起第二列,其数字为 1。因此,a 的 ASCII 码是十六进制数 61。
下图用简单的形式说明了这个过程:
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” |