在前面其实也谈到了 ASCII 了, 但并没有很具体, 作为一个完整系列的一部分, 还是有必要谈一下, 也作为后面讨论的一些基础.
ASCII
它的全称是 American Standard Code for Information Interchange(美国信息交换标准代码), 是一个 7 位字符编码方案. 下面是它的一张简图(来自http://www.asciitable.com/index/asciifull.gif):
ASCII 定义了 128 个字符, 包括 33 个不可打印的 控制字符(non-printing control characters) 和 95 个可打印的字符.
控制字符
32 以下的及最后一个 127 是所谓的控制字符. (0x00~0x1F 以及 0x7F)
即上图最左边一列的 32 个字符及最右边一列最后的一个字符(DEL, 删除)
熟悉的有
- 0x09(TAB, horizontal tab, 水平制表符)
- 0x0A(LF, line feed, ’\n’换行符)
- 0x0D(CR, carriage return, ’\r’回车符)
其它的很多现在已经是废弃不用了.
关于回车换行(‘\r\n’), 在屏幕还不普及的时代, 结果输出经常是依赖于所谓的电传打印机, 打印头 就像一辆车子沿着打印杆从左向右移动并打印出一个个字符, 当碰到一个回车符时(CR, 0x0D, ’\r’), 打印机就指示打印头重新回到最左边的位置上, 这即是传统意义上的回车了.
把打印头想像成一辆小车, 回车即是退回原处, 现代意义上的回车则通常包含回车与换行两个动作.
回车符后常跟着一个换行符(LF, 0x0A, ’\n’), 打印机收到换行符就会指示滚筒滚动, 这样, 打印头就对准了纸张上的新的一行. 如果没有换行, 新的打印输出就会重叠在上一行上, 有时走纸不顺畅时也会造成这种后果.
目前, 在 Windows 系统上, 回车键会产生两个字符 CRLF, 一起表示换行.
Unix/Linux 之类的则单独用 LF 表示换行,
而苹果的 Mac 则单独用 CR 来表示换行(有些说还是用 LF, 可能早期和后期有了变化, 使用 Mac 的同学可自行验证一下).
其它字符
包括空格, 字母, 数字以及一些常见的标点符号等.
关于 空格(SPACE, 图中第二列第一个, 0x20), 它没被归到控制字符类, 当然, 你可能会纠结它是否算可打印的.
由于只定义了 27=128 个字符, 用 7 bit 即可完全编码, 而一字节 8 bit 的容量是 256, 所以一字节 ASCII 的编码最高位总是 0, 这为后来的编码方案兼容它带来的便利.
ISO-8859-1
ISO-8859-1 又称 Latin-1, 是一个 8 位单字节字符集, 它把 ASCII 的最高位也利用起来, 并兼容了 ASCII, 新增的理论空间是 128, 但它并没有完全用完: (截图来自http://zh.wikipedia.org/wiki/ISO/IEC_8859-1)
可以看到, 新增部分也保留了前面的 32 个位置(中间绿色部分, 0x80-0x9F), 与前面的 ASCII 部分类似, 所以实际只增加了 128-32=96 个, 主要是西欧的一些字符, 另外可以看到乘号(0xD7)和除号(0xF7)也被包含进来了.
0x00-0x1F, 0x7F, 0x80-0x9F 在此字符集中未有定义. (即图中的绿色部分)
ISO-8859-1 能与 ASCII 兼容, 同时它的适用范围又较广, 一些协议或软件把它作为一种缺省编码, 当然, 现在更好的选择是 UTF-8.