

正如世界上有各种表达形式和书写格式不同的语言一样,在计算机的世界里同样存在类似的问题:在计算机发展初期,不同的计算机系统对字符的处理方式不同,这导致了各个系统之间不能互相交流。为了解决这个问题,人们制订了多种标准以便不同系统之间也能正确进行字符交互,这就是字符编码的由来。
由于字符可以通过多种途径进行表达,所以它们的编码也多种多样,常见的英文字符编码有ASCII、ANSI、Unicode、UTF、ISO等,对于非英文字符,常见的字符编码有GBK、BIG5、JIS等。可能有的读者已经开始不耐烦了:说了半天“编码”,到底什么才是编码?
这里,我们用一个小例子帮助大家理解什么是“编码”。我们可以这样理解:一杯水无论放进什么形状的杯子里都还是水,而不会变成老虎之类的,这个道理很简单,对不对?那么同样的法则也适用于字符。对一个字符来说,无论系统内部怎么处理,只要最终显示出来的是原来的字符,那就没错。例如“小”字,Unicode编码把它作为“%D0%A1”存放,而ASCII编码里,它可以用“-12127”来表示,但是无论它怎么变,只要还能还原回“小”字,系统的处理工作就不会出问题(图1)。

图1
多种编码的产生本来是为了解决字符信息的交互问题,然而正是这些多种多样的编码导致了让人意想不到的后果。字符——这个不起眼的小东西在编码的世界里举起了“大刀”这使得上面提到的“水变成老虎”成为可能。
字符威胁实录
在接触计算机不久的时候你听说了一个词“ASCII”;到了Windows 2000开始流行的时候,你知道“Unicode”帮你解决了不少乱码问题;当你成为计算机高手以后,你常常会跟“SQL”玩个不亦乐乎,可是你知道吗?在这些你所熟知的字符或编码背后,隐藏着什么样的危险吗?你知道这样的危险就在你身边吗?
控制符:想说爱你不容易
ASCII全称American Standard Code for Information Interchange(美国信息互换标准代码),是最基础的字符表达方式,它能完整表示26个英文字母、10个数字以及通用的格式符号等。ASCII又分为控制字符和可显示字符(也称为“Printable”,即可打印字符),通常情况下,控制字符只能由特殊按键和系统自己产生,而且这些字符中的大部分是我们看不见的。但是你千万不要以为看不见即不存在,恰恰相反,它们时刻存在!例如,在你保存一个文本的时候,系统就会自动在文件结尾添加一个你看不见的结束符号,这个符号的作用就是用来告诉处理程序,读取到这里的时候:停!专业说法可以称之为文件结束符。