我的个人博客

再谈编码问题

之前在www.cloudaice.com上面写了一篇关于编码的问题,现在用python写程序的时候又感觉自己对于一些细节的问题有些迷糊了,想来想去,编码问题其实对于写程序,无论在什么时候都会碰到,尤其是中文的。英文因为大部分编码基本上都是兼容的,所以基本没有什么问题。现在就再记录记录自己的感想吧,本来是想写一个google翻译的小工具的,后来竟然在研究编码问题了。不过也发现了有人也已经写过这样的程序,而且还有源代码。再加上自己对抓网页验证什么的不是很熟悉,犯懒一下,顺便安慰自己不用造轮子了!!!

对于计算机闻言,其实所有文件都是以二进制格式保存的。而所要做的就是支持人们的写入和读取。而编码问题也就出现在这两个步骤中。其实要分析起来也是很简单的。拿大家都熟悉的ascii码来说。我们要在计算机中存入字母A,那么我们就在计算机中输入10010111(A的ascii码)。当然我们要是能够对计算机在位级别上操作的话就很简单,只不过这样的输入太麻烦了。读取也是一样,当我们看到10010111时候我们就知道它表示的是A。当然这些是可以扩展到其他语言和符号上去的,只要我们手中有一张对照的表就可以。如果我们都是以位级别去理解和操作计算机的话,只要加上一个位显示器,那么编码问题就会显得非常简单。同时这样的操作效率是无法容忍的。就仿佛是在用机器码写程序一般。于是我们通过以下方面进行改进。以下说法仅仅限于个人观点,有些还没有验证。如有错误,热切希望指出。

在存入方面,我们不能一位一位地敲入二进制数来完成内容的输入。于是我们要更加快捷的方法。比如可以直接敲入“A”,就表示输入A,计算机会自动保存成A的二进制编码。于是在这个过程中间有计算机的软件和硬件帮我们完成了。因为当今世界上有各种各样的编码方式,因此我们需要了解计算机是用怎么样的编码方式保存的,不然在我们读取的时候就会不知道怎么去把这些二进制码翻译成我们需要的并且能够识别的字符。就像我们手中需要一张对照的表。到此,大部分人都以为存入就差的不多这么简单了吧,其他都是软件的问题了。然而,我们忘记了很重要的一点,那就是显示问题。在我们能够以位级别操作的时候,我们只要看见二进制码就可以了,也不需要显示转换什么的。而现在不一样。显示字符本身就是一个编码和解码的过程。而现在我们绝大多数能够和计算机交互的就是屏幕。当我们按下一个A,屏幕上就显示了一个‘A’。我想问的是这个时候‘A’是以什么样的方式显示出来的呢?因为这个时候我们还没有保存它,也就是说没有设置它的编码方式。其实这里我也不是很明白,但是我认为这应该就是和系统的默认编码方式有关了。就是在默认情况下,系统会使用默认的系统编码方式,例如windows使用ascii和gbk(中文);linux使用utf-8编码方式。至此,我们基本上解决了输入的问题。下面我们看看输出的问题,显然,我们只要记住了文件当时输入是以什么样的编码格式保存的,那么输出就是非常简单的了。但是很多时候问题恰恰是出现在这个地方。乱码问题大多都是因为不知道文件原来的编码方式是什么,而是用了默认的编码方式去解码。好比我们输入存在计算机里面是使用一张表,但是我们要从计算机里面的二进制内容读出来的时候使用了另外一张表。这两张明显是不一样的,所以对于相同的二进制内容翻译出来的结果就是不一样了。一个用汉语拼音写成的句子,别人却把它当做英语来读,那么这其中的意思只有天知道了。因此我们写程序的时候只要保证系统用到这个文件时候使用的解码方式正好是文件本身的编码方式。那么久绝对不会出现乱码的问题的。

在windows中汉字默认是使用'gbk'编码和解码的。因此当你用utf-8编码保存一个字符串的时候,输出就会出现乱码了。当然这里不考虑某些文本阅读器具有自动检测编码功能。

就说到这里吧。感觉没有结合具体实例来讲,不过在写这个之前,我自己是在linux和windows下面做了很多探索实验的。用了各种查编码工具,还有二进制查看工具。等待以后编程中不断碰到问题,解决问题来完善。

posted @ 2012-01-22 15:11  cloudaice  阅读(365)  评论(0编辑  收藏  举报
我的个人博客