Python字符串编码问题

六月 17th, 2010 发表评论 阅读评论

Python中字符串有两种:str类型和unicode类型。字符串在Python内部的表示是unicode编码。

首先,一个字符串如果没有显式指定编码格式,就是str类型,而编码格式会使用它所在的文件或者系统的默认编码格式。如 s='你好',如果你的文件格式或者系统编码是ASCII,则s就是ASCII编码形式进行存储。如果你的文件头部指定了文件的编码格式,或者系统编码 如 utf-8 或者 gb2312等,则s是作为相应的编码格式存储的。既是,str类型可能有很多种不同的编码形式存储。(当然,这时候的s不可能作为ASCII编码存储, 因为汉字超过ASCII码的范围了。因此,当你保存文件时候,系统会提示你,文件里含有非ASCII编码的字符,需要存储为其他格式,如utf-8等)。

如果你定义字符时候指定了要以unicode编码,像s=u'你好',这样s就是以unicode来进行存储的了。

所以,要处理一个字符串,首先需要知道它是以什么形式编码的,才能够正确处理它。

如果一个字符串是str类型的,如果需要,通常以unicode作为中间编码,即先将它解码(decode)成unicode,再从unicode 编码(encode)成另一种编码。而且要使用正确的格式进行解码,如果是utf-8编码的,而你却误将其以gbk解码生成unicode,就会发生错误 了。解码的方法有unicode(s,'utf-8')和s.decode('utf-8')这两种,是一样的。

如果一个字符串是unicode类型的,如果需要可以直接进行编码处理。

因此通常要对其编码方式是否为unicode进行判断:

isinstance(s, unicode)  #用来判断是否为unicode

如果一个字符串是str类型的,直接进行编码就会出问题。因为这样,系统会先使用默认的解码格式进行解码成unicode,然后再进行编码。如果默认的解码格式和原来的字符串的编码格式不同,解码就会出错(比如ASCII解码超出128范围)。

如果一个字符串是unicode类型的,直接进行解码就会有问题。因为这样,系统会先使用默认的编码格式进行编码,然后再进行解码。如果默认的编码格式不能正确进行编码(如ASCII就不能对汉字进行编码,已经超出了它的128范围),就会出错。

从输入输出来讲:对输入\读取的字符串,要了解它的编码格式,才能正确解码,并能在程序中进行正确处理;对要输出\存储的字符串,要了解系统的当前默认编码,并将字符串转换为这个相应的编码,才能正确输出和存储。正确实践上两条一般就不会出错了。

如,读取非系统默认编码的文件,需要使用codecs模块,指定文件encoding的类型才可。

p.s.类型,编码有点乱,自己还需要再搞清楚一点。。。。python3k只有unicode一种类型,可以减少很多这方面的麻烦和不便,希望尽快普及起来吧。

分类: Python 标签: python  编码  解码  unicode 

Powered by Google App Engine