Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1490108
  • 博文数量: 465
  • 博客积分: 8915
  • 博客等级: 中将
  • 技术积分: 6365
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-30 15:05
文章分类

全部博文(465)

文章存档

2017年(33)

2016年(2)

2015年(4)

2014年(29)

2013年(71)

2012年(148)

2011年(178)

分类: IT业界

2012-08-02 17:01:57

字符编码

 

人类采用十进制,数字是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 个,加上各种符号,就超出642 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://blog.chinaunix.net/space.php?uid=13164110&do=blog&id=3289954

 

阅读(487) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~