解决Python中文乱码问题方法总结
本文总结了Python中常见的中文乱码问题及解决方法,涵盖SyntaxError、UnicodeDecodeError和UnicodeEncodeError等典型错误。文章详细解释了decode与encode的工作原理,分析了IDE控制台输出限制,并提供了针对特定环境(如UliPad、Windows XP)的编码转换代码示例,包括处理网页内容时的编码转换策略。
在运行类似以下的代码时:
#!/usr/bin/env pythons="中文"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在英文Windows XP系统上的控制台信息输出窗口按ASCII编码输出(英文系统默认编码为ASCII),而上述代码中的字符串是Unicode编码,因此输出时产生错误。
将最后一句改为:print s.encode('gb2312')
则能正确输出“中文”两个字。
若最后一句改为:print s.encode('utf8')
则输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按ASCII编码输出UTF-8编码字符串的结果。
下面代码可能较为通用,如下:
#!/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-8s="中文"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 httplib2def 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 xpimport httplib2def 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 sysreload(sys)sys.setdefaultencoding('utf-8') #修改默认编码方式,默认为ascciprint sys.getdefaultencoding()content= getPageContent("//www.jb51.net/")print content.decode('utf-8').encode('gb2312')
上述代码的含义是向www.jb51.net网站请求其主页(若直接为UTF-8编码,无法输出中文)。尝试将编码方式从UTF-8转换为GB2312时,出现“问题三”。
当我将print content.decode('utf-8').encode('gb2312')改为print content.decode('utf-8').encode('gb2312', ‘ignore')时,问题解决了,可以显示中文了,但不确定是否完全适用,似乎仅部分情况有效,有些内容无法使用GB2312编码。
然而,当把网站换成www.soso.com时,无需转换为GB2312,使用UTF-8即可正常显示中文。
总结一下:
向文件直接输出ss会抛出同样的异常。在处理Unicode中文字符串时,必须首先调用encode函数,转换为其他编码输出。这一点对各环境均适用。在Python中,“str”对象是一个字节数组,至于其中的内容是否为合法字符串,以及采用何种编码(GBK、UTF-8、Unicode)并不重要,这些内容需由用户自行记录和判断。这些限制同样适用于“unicode”对象。需记住,“unicode”对象中的内容绝对不一定是合法的Unicode字符串,我们很快会看到这种情况。在Windows控制台上,支持GBK编码的str对象和Unicode编码的unicode对象。
更多关于解决Python中文乱码问题方法总结的文章请查看下面的相关链接
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













