老是碰到这个问题,决定好好给整理一番思路。
翻阅资料和实践证明,以下论述为真理:
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
即:
可以通过:sys.setdefaultencoding统一为decode和encode指定编码。默认情况下也是统一采用相同的方式decode和encode。
因此很多时候出错:
cannot decode xxxx
cannot encode xxxx
就是在这两个过程中出错的。
粗看有点脱裤子放屁的嫌疑:
假设我们的编码是gb2312,那么先转成unicode(decode过程)
然后再次转成gb2312(encode过程)。
实则不然,这是一个完全的设计,可以支持将某种编码: 外星编码 ---(decode)---->python能够识别的编码-----(encode)---->人类能够识别的编码
很多函数也支持在处理时指定编码,比如 simplejson的dumps函数,有个参数 enable_ascii (是否有ascii码进行decode、encode)
默认情况下,我们在py文件的头部统一指定编码,像下面这样:
# -*- coding:utf-8 -*-
然后有些时候,(比如在windows平台中文环境下),得到的编码如果不是utf-8编码,这个时候用python处理字符串,首先它会用utf-8进行decode,若字符串不是unicode码,那么就会报错。
那么,我们可能会想到,直接给你decode好, str.decode(‘已经的某种编码‘) ,
好吧,这样可以,但在接下来encode时会报错,因为默认会按照 utf-8进行encode。而且这个过程可能你控制不了,比如通过find进行查找。人家没提供参数给你设定encode时的编码。
这个时候解决方法有两个:
1. 将文件头默认的coding改成已知编码
# -*- coding:已知编码 -*-
2. 采用sys.setdefaultencoding强行加载编码
import sys
reload(sys)
sys.setdefaultencoding(已知编码)
转载请注明来自:http://www.cnblogs.com/Tommy-Yu/p/4020453.html,谢谢