python中文乱码问题大总结
在运行这样雷同的代码:
#!/usr/bin/env python s="中文" print s
最近常常碰着这样的问题:
问题一:SyntaxError: Non-ASCII character '\xe4' in file E:\coding\python\Untitled 6.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
问题二:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 108: ordinal not in range(128)
问题三:UnicodeEncodeError: 'gb2312' codec can't encode character u'\u2014' in position 72366: illegal multibyte sequence
这些都是跟字符编码有关的问题,很郁闷,中文老是弄不出来,找了许多方案,这里有些是我前几天找到的一些方案,拿出来给各人分享一下哈
字符串在Python内部的暗示是unicode 编码,因此,在做编码转换时,凡是需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
decode的浸染是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),暗示将gb2312编码的字符串str1转换成unicode编码。
encode的浸染是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),暗示将unicode编码的字符串str2转换成gb2312编码。
在某些IDE中,字符串的输出老是呈现乱码,甚至错误,其实是由于IDE的功效输出节制台自身不能显示字符串的编码,而不是措施自己的问题。
如在UliPad中运行如下代码:
s=u"中文"
print s
会提示:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)。这是因为UliPad在英文WindowsXP 上的节制台信息输出窗口是凭据ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时发生了错误。
将最后一句改为:print s.encode('gb2312')
则能正确输出“中文”两个字。
若最后一句改为:print s.encode('utf8')
则输出:\xe4\xb8\xad\xe6\x96\x87,这是节制台信息输出窗口凭据ascii编码输出utf8编码的字符串的功效。
下面代码大概较量通用一些,如下:
#!/usr/bin/env python #coding=utf-8 s="中文" if isinstance(s, unicode): #s=u"中文" print s.encode('gb2312') else: #s="中文" print s.decode('utf-8').encode('gb2312') #!/usr/bin/env python #coding=utf-8 s="中文" if isinstance(s, unicode): #s=u"中文" print s.encode('gb2312') else: #s="中文" print s.decode('utf-8').encode('gb2312')
看看下面一段代码:
#!/usr/bin/env python #coding=utf-8 #python version:2.7.4 #system:windows xp import httplib2 def getPageContent(url): ''''' 利用httplib2用编程的方法按照url获取网页内容 将bytes形式的内容转换成utf-8的字符串 ''' #利用ie9的user-agent,假如不配置user-agent将会获得403克制会见 headers={'user-agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'cache-control':'no-cache'} if url: response,content = httplib2.Http().request(url,headers=headers) if response.status == 200 : return content
import sys reload(sys) sys.setdefaultencoding('utf-8') #修改默认编码方法,默认为ascci print sys.getdefaultencoding() content = getPageContent("http://www.oschina.net/") print content.decode('utf-8').encode('gb2312') #!/usr/bin/env python #coding=utf-8 #python version:2.7.4 #system:windows xp import httplib2 def getPageContent(url): ''' 利用httplib2用编程的方法按照url获取网页内容 将bytes形式的内容转换成utf-8的字符串 ''' #利用ie9的user-agent,假如不配置user-agent将会获得403克制会见 headers={'user-agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'cache-control':'no-cache'} if url: response,content = httplib2.Http().request(url,headers=headers) if response.status == 200 : return content
import sys reload(sys) sys.setdefaultencoding('utf-8') #修改默认编码方法,默认为ascci print sys.getdefaultencoding() content = getPageContent("http://www.oschina.net/") print content.decode('utf-8').encode('gb2312')
上面的代码的意思:向www.oschina.net网站请求他的主页,(假如直接是utf-8编码,不能输出中文)想将编码方法为utf-8转向gd2312,呈现问题三
当我把它将print content.decode('utf-8').encode('gb2312')改成 print content.decode('utf-8').encode('gb2312', ‘ignore’)时,OK了,可以显示中文了,但不敢确定是否为全部,貌似只有部门吧,有些不能用gb2312编码
然而,当我把网站换成 www.soso.com时,不消转为gb2312,用utf-8即可正常显示中文
总结一下:
#p#分页标题#e#
向文件直接输出ss会抛出同样的异常。在处理惩罚unicode中文字符串的时候,必需首先对它挪用encode函数,转换成其它编码输出。这一点对各个情况都一样。在Python中,“str”工具就是一个字节数组,至于内里的内容是不是一个正当的字符串,以及这个字符串回收什么编码(gbk, utf-8, unicode)都不重要。这些内容需要用户本身记录和判定。这些的限制也同样合用于“unicode”工具。要记着“unicode”工具中的内容可绝对不必然就是正当的unicode字符串,我们很快就会看到这种环境。在windows的节制台上,支持gbk编码的str工具和unicode编码的unicode工具。