有代理资源网

热门关键词: 
旗下栏目:vbs脚本Erlang脚本Golang脚本Lua脚本linux shell脚本PowerShell脚本seraphzone脚本autoit脚本ruby专题ColdFusion脚本远程脚本 帮助
您现在的位置:首页 > 脚本专栏 > python脚本 > 正文

python中文乱码问题大总结

所属栏目: python脚本 | 发布时间:2017-02-05 15:00:45 | 小编:刀刀 | #我要评论#

在运行这样类似的代码:

#!/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即可正常显示中文


总结一下:


  向文件直接输出ss会抛出同样的异常。在处理unicode中文字符串的时候,必须首先对它调用encode函数,转换成其它编码输出。这一点对各个环境都一样。在Python中,“str”对象就是一个字节数组,至于里面的内容是不是一个合法的字符串,以及这个字符串采用什么编码(gbk, utf-8, unicode)都不重要。这些内容需要用户自己记录和判断。这些的限制也同样适用于“unicode”对象。要记住“unicode”对象中的内容可绝对不一定就是合法的unicode字符串,我们很快就会看到这种情况。在windows的控制台上,支持gbk编码的str对象和unicode编码的unicode对象。



热点聚合:Python 乱码

看过本文的人还看过

本周热门

关于有代理资源网-版权声明-广告服务-发展历程-常见问题-联系我们- TAG标签-网站地图

本站资源来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!
侵权删帖/违法举报/投稿联系邮箱:duomu@vip.qq.com

Copyright © 2014-2018 有代理资源网 版权所有 鄂ICP备14013235号-8  鄂公网安备 42090202000244号  

Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。