Python2.7 编码问题解决方案

编码问题,可以说是Python中最让人头痛的问题了。

本质上是, 含有特殊编码(非ASCII码)原始字符串流与Unicode对象之间的转换问题。

考虑如下情境:

来自文件或者来自网络的,一个含有特殊字符的原始字符串流 x, 与一个unicode字符串相加

addStr = x + u'Python2.7 编码' 

系统在执行上面这个表达式的时候会产生哪些动作?

答案:

1) 原始字符串流与unicode相加, 先会把原始字符串流转成unicode对象,然后再与另外一个unicode对象加。 表达式x会被系统转成一个unicode对象

2) x 被转成unicode对象,翻译成术语就是“x被系统解码成unicode对象”。 那系统用什么编码类型来解码? 当然是系统默认编解码方式来解码。

可以通过:

import sys

print sys.getdefaultencoding()

来查看系统默认编码(默认的是ASCII码方式

3)想想,如果x不含有特殊字符,那么用系统默认的编码ASCII码解码,当然没问题。可是,如果x含有特殊字符, ASCII码当然不能识别特殊字符,当然就报错了。

报错该怎么解决?

答案:

(首先你应该知道x原本是哪种编码的,这应该不难吧。)

1)在 x 与 u'Python2.7 编码' 相加的时候,手动为x解码,采用x里面字符本身的编码方式,如 ‘utf-8’或者 ‘gb2312’ 或者其他

addStr = x.decode('utf-8') + u'Python2.7 编码'

2) 另外一种方式便是,一开始就重设系统默认编码为你指定的类型 ’utf-8’ 或者 ‘gb2312’  或者其他

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

---------------------------------------------------------------------------------------------------------------------

对于编码的解释,大概如上。给出完整的解决方案如下:

1) 保证工程.py文件本身都是utf8无BOM编码模式,如果不是,请手动转成utf8 without BOM

2) py文件开头设置编码头部, # –*- coding:utf8 –*-

3)重新设置系统编码,在工程开始的时间点:

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

4)在有特殊字符的字符串前面添加 u字符,注明为unicode对象字符串

------------------------------------------------------------------------------------------------------------------------

遵循上面给出的方案,就不会被编码的问题反复折腾。 仅仅是个人的一点点工作中的经验。

 

(注: Python3.x之后,系统默认编码是utf8)

posted @ 2015-12-18 12:29  Fedel  阅读(461)  评论(0编辑  收藏  举报