解决Python中文乱码问题方法总结

花开有时
花开有时
发布时间:2026-10-15 | 5人浏览过
原创

本文总结了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中文乱码问题方法总结的文章请查看下面的相关链接

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表