字符编码
人类采用十进制,数字是0-9。计算机是二进制的世界,只有0 与1 两种选择,称为比特(bit)。
你可以想象一个灯泡就是一个比特,亮代表1,不亮代表0。
十进制的0 写成二进制是0,十进制的1 写成二进制是1,十进制的2 写成二进制是10,十
进制的3 写成二进制是11,十进制的4 写成二进制是100,十进制的256 写成二进制是
100000000。随着数值增大,二进制的长度增长得很快,十进制的256 只需要3 个数字,转成
二进制却需要9 个数字。二进制(比特)只适合计算机,不适合人类使用。
于是我们把四个比特结合在一起,姑且称为半字节,半字节能表示的数字范围提升到16。而
阿拉伯数字最高只能表达到9,至于10 ~ 15 分别用英文字符ABCDEF(不区分大小写)表示。
写代码或者写文章时,我们很少使用二进制,一般使用十进制或者十六进制。为了区分写出来
的数字是哪种进制,我们习惯在十六进制前面加上0x,而十进制数字前不加任何东西。例如:
0x20 相当于32。
计算机把两个半字节结合在一起,称为字节(byte)。一个字节有8 个比特,数字范围变成
0~255,也就是0x00~0xFF。
英文字母大小写,加上10 个阿拉伯数字,共62 个,加上各种符号,就超出64(2 的6 次方)了。
所以最早我们用7 个比特(2 的7 次方)来表示字符(character),因此制订了一个标准,叫做ASCII。通常用一个字节来代表一个字符(不过这就浪费了一个比特)。
这就是完整的ASCII 字符编码表。绿色的部分是ASCII 的编码(这里用十六进制数字表示),
灰色与白色的部分是编码对应的字符,其中灰色的是不可显示字符,白色的是可显示字符。
只有可显示字符才能被打印出来。可显示字符的范围是在0x20 与0x7E 之间。注意,0x7F 是
不可显示字符。
那些不可显示的字符,我们看不到,那么又要如何输入呢?我们可以通过转义串(escape
sequence)的方式使用它们,就像是一种代号。编码为0x00 的字符用^@ 表示,编码为0x01
的字符用^A(大小写皆可)表示等,如上表所示。
有些不可显示字符的转义串不止一种,例如编码为0x09 的字符就有三种表示法,可以是^I、
^-、^(TAB)(大小写皆可)。
不可显示字符中,目前最常用的是0x0A 与0x09。输入0x0A 有换行的效果,输入0x09 会跳到
下一个表格定位点(对交互环境来说,表格定位点就是8 的倍数位置)。
字符的表达方式是在字符(或者字符的转义串)本身前后加上英文双引号,然后再在这个整体
的前面加上#。
打印可显示字符(例如#"a"),很简单地在界面上就出现该字符。如果打印不可显示字符,
又会如何?不同的不可显示字符有不同的效果,以0x07 字符来说,效果就是发出一声“哔”。
对0x0A 字符来说,就是换行。
我们可以通过to-integer
把字符转成整数,然后用to-hex 把整数转成看起来像十六进制
的值#0000000000000007,但我们希望只取得最后两个数字,所以通过修饰字/size 2
来
改变to-hex 的行为,使得to-hex 只保留最后两个数字。
让我们写一个稍微长一点的程序。这个程序文件名为dump.reb,它可以用来分析文件内容。把
文件内容输出到界面上,界面分成左右两部分,左边是文件内容的十六进制数据,右边则把数
据当成ASCII 呈现出来。右边遇到不可显示的字符(包括空格0x20)时就用一个点代替。
关于此代码的其他细节,在此不解释。
本文节选自《编程ING:人人都能学会程序设计》一书
蔡学镛 著
电子工业出版社出版
图书详细信息:
http://www.cnblogs.com/broadview/archive/2012/07/27/2611683.html