python 2.x的编码问题
From: http://www.cnblogs.com/inside/archive/2011/12/02/2272047.html
我发现很多刚刚接触Python的同行在python版本的选择上比较头疼,python3是未来的确是毋庸置疑,但是现实是缺乏很多强大的第三方库;2.x系列呢,又有很多人纠结编码问题,其实到了2.7的年代,python在编码以及平滑向3过渡的问题已经做了大量工作了。
我就基于python 2.7简单说说编码的事情,让更多人可以完全不用担心python的编码问题,放心大胆的使用当前的主流版本,并且将来还可以轻松过渡到python 3.x。
----------------------
首先,讲讲str和unicode这两个对象。
str:其底层存储的字节跟输入有关,如果终端输入的是gbk编码的'中国',那么str里面保存的字节序列是'\xd6\xd0\xb9\xfa',如果输入编码是utf8,那么字节序列为'\xe4\xb8\xad\xe5\x9b\xbd'。而如果在终端用gbk编码显示字节序列为utf8编码的'中国',当然会乱码了。所以要搞定这种问题,首先要知道str里面的字节序列是什么编码的,找输入的源头吧。
unicode:其与str不同在只要你能正确生成unicode对象,那么此对象保存的东西永远是unicode编码,跟输入时的编码无关,你也不用知道其底层使用的是什么字节序列,只需要知道取出来的时候是unicode对象,要转成其他编码的字节序列的话encode一下就行了,例如,我有一个保存着"中国"二字的u,你要输出到gbk终端,那么可以u.encode('gbk'),这样就生成了一个gbk编码的字节序列。
仅此而已,搞清编码问题就是这么简单。
然后,来说说实际操作。
因为未来的python是全unicode的,所以在2.7中我们也最好把所有输入的字符串都生成为unicode对象,然后再进行各种操作。为了省事,以及完全忽略str和unicode的不同,可以在代码开始之前加上这句
(想知道__future__是什么东西,可以自己看看python v2.7.2 doc的27.11节)
加上这句之后,'中国'和u'中国'一样,都是生成了unicode对象,在这种情况下,除非接收第三方库的输入或者使用str(),基本很难见到非unicode的字符串了。如此,你就不用再分心字符串到底是哪种对象的问题了,也不用写满篇的u'xxx'。
需要注意的就是,在使用某些诡异的较古老的第三方库,尤其是基于C的库时,注意要把unicode对象转成适当编码的str对象,因为这些库对特定编码的字节序列有依赖。
实际上,我本人的python代码都会在头部写上
from future_builtins import *
如此写出来的代码,跟python 3基本没什么区别,到时候过渡过去非常轻松。
希望大家在python生涯中轻松愉快。