这个问题在python3.0里已经解决了。
这有篇很好的文章,可以明白这个问题:
为什么会报错“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
”?本文就来研究一下这个问题。
字符串在Python
内部的表示是unicode
编码,因此,在做编码转换时,通常需要以unicode
作为中间编码,即先将其他编码的字符串解码(decode
)成unicode
,再从unicode
编码(encode
)成另一种编码。
decode
的作用是将其他编码的字符串转换成unicode
编码,如str1.decode('gb2312')
,表示将gb2312
编码的字符串str1
转换成unicode
编码。
encode
的作用是将unicode
编码转换成其他编码的字符串,如str2.encode('gb2312')
,表示将unicode
编码的字符串str2
转换成gb2312
编码。
因此,转码的时候一定要先搞明白,字符串str
是什么编码,然后decode
成unicode
,然后再encode
成其他编码
代码中字符串的默认编码与代码文件本身的编码一致。
如:s='中文'
如果是在utf8
的文件中,该字符串就是utf8编码,如果是在gb2312
的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需 要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默 认编码创建的代码文件。
如果字符串是这样定义:s=u'中文'
则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。
如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:
isinstance(s, unicode) #用来判断是否为unicode
用非unicode编码形式的str来encode会报错
如何获得系统的默认编码?
#!/