解决python中文乱码问题方法总结
作者:WDC 发布时间:2022-01-30 18:47:56
在运行这样类似的代码:
#!/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在英文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-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转向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对象。


猜你喜欢
- 一:函数介绍np.random.permutation() 总体来说他是一个随机排列函数,就是将输入的数据进行随机排列,官方文档指出,此函数
- 前面文章分别简单介绍了线性回归,逻辑回归,贝叶斯分类,并且用python简单实现。这篇文章介绍更简单的 knn, k-近邻算法(kNN,k-
- 前言:我们想要在爬虫中使用xpath、beautifulsoup、正则表达式,css选择器等来提取想要的数据,但是因为scrapy是一个比较
- 上次在blueidea上看到一个元素圆角的实现方法,但是那个太复杂了。于是就自己写了一个函数,可以将元素自动圆角,如div层,表格等。共有四
- NMS 算法在目标检测,目标定位领域有较广泛的应用。算法原理非极大值抑制算法(Non-maximum suppression, NMS)的本
- 我们曾经提到,Oyster.com的Python web服务器怎样利用一个巨大的Python dicts(hash table),缓存大量的
- 重点部分:点击表单的 submit按钮 触发form 部分 @submit=”submit”事件:submit事件 定义在js部分: pre
- Mysql查看表、字段信息查看表信息使用MySQL创建的表,无论是表注释、索引,还是字段的类型等等,都会存到MySQL自带的库表中,可以通过
- 我通过如下的一段程序发送post请求:import urllib3pool = urllib3.connection_from_url(
- 我很想自己写一个这样的程序,不过wordpress是php的,我blog是ASP的,只好用ASP写代码了。经过一番折腾测试,终于让我的梦想变
- 前言没有用过的东西,没有深刻理解的东西很难说自己会,而且被别人一问必然破绽百出。虽然之前有接触过python协程的概念,但是只是走马观花,这
- 今天在公司实在没有事做,突然就想到写下商城的购物车的前端框架,当然我这里只有购物车的增删改查,也许写的并不是那么完善,但最重要的是一个入门,
- reduce函数原本在python2中也是个内置函数,不过在python3中被移到functools模块中。reduce函数先从列表(或序列
- 在使用jQuery类库实现tab功能时,是获取鼠标在mousenter或click时的index值,然后切换到当前的标题和内容,把其他的标题
- 配置篇打开设置界面许多设置都需要在设置界面进行,所以想要配置第一步就应该是打开设置界面。1> 鼠标操作打开。File --> P
- 在实际信息系统开发中,经常会用到各种各样的协议,网络协议常用的有http,tcp,udp等,传输数
- 前言:python数据类型: python数据结构之数据类型.今天我们主要来介绍一些内置函数,比如输入输出,控制,和异常的用法,尤其是输出和
- 通过学习装饰器可以让我们更好更灵活的使用函数,通过学会使用装饰器还可以让我们的代码更加优雅。在我们的实际工作中,很多场景都会用到装饰器,比如
- 1、pd.cut()用于将数据值按照值本身进行分段并排序到 bins 中。参数包含:x, bins, right, include_lowe
- 前言本文主要介绍的是关于Django验证码生成与使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:方法如下:1、基于PIL生