字符串在python内部的表示是unicode编码,所以,在编码转换时,通常以unicode编码为中介。
这个过程是这样的,用decode将某种字符编码转换成unicode编码,比如str.decode('gb2312'),或者 u'str',将str从'gb2312'编码转换成'unicode'编码;然后再用encode将unicode编码转换成目标编码形式,比如str.encode('utf8'),将str从'unicode'编码转换成'utf8'编码。
在转码的时候一定要先搞明白,字符串str是什么编码。
代码中字符串的默认编码与代码文件本身的编码一致。查看系统源代码:
import sys
print sys.getdefaultencoding()
在英文系统中,输出为 ascii
如,str='中文'
如果在文件开头加上'#-*-coding:utf-8-*-',即utf8文件,那么该字符串就是utf8编码,直接print即可。如果是在gb2312文件中,则其编码为gb2312,这种情况下就需要按照上面的转码步骤进行转码。
通常,在没有指定特定的编码方式时,都是使用系统默认编码创建代码文件。
如,str=u'中文'
说明该字符串已经是unicode编码了,即python的内部编码,与代码文件本身的编码无关。在这种情况下,如果需要编码转换,只需要直接使用encode即可。比如,str.encode('utf8')。
如果,一个字符串已经是unicode编码了,再进行解码就会报错,所以需要确认编码形式是否是unicode:
isinstance(str, unicode)
在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。
在英文系统中,输入:
str = <span style="font-family: Arial, Helvetica, sans-serif;">u'中文'</span>
print str
系统会报错,UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)。这是因为
在英文系统中,控制台信息输出窗口是按照ascii编码输出的,而上面是unicode编码,所以会产生错误。
解决方法是,改为:
print str.encode('gb2312')
或者
print str.encode('utf8')
注意,unicode(str, 'gb2312') 和 str.decode('gb2312')是一样的,都是将gb2312编码转换成unicode编码。
从网上看到讲的这么详细的,非常受益,就 转载过来。
下面代码值得学习:
#-*-coding:utf-8-*-
str = '中文'
if ininstance(str, unicode):
print str.encode('gb2312')
else:
print str.decode('utf-8').encode('gb2312')