您的位置:首页 > 理论基础 > 计算机网络

python 使用urllib2进行https请求时出现'ascii' codec can't decode byte 0xe9 错误

2017-09-27 10:36 399 查看
最近在开发公众号,其中进行到菜单开发时,使用urllib模块通过官方提供的https链接进行创建菜单操作:

def create(self, postData, accessToken):
postUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=%s" % accessToken
if isinstance(postData, unicode):
postData = postData.encode('utf-8')
urlResp = urllib.urlopen(url=postUrl, data=postData)
print urlResp.read()

调用create()进行创建操作之后,出现ssl:unknown错误提示,查找原因,说是http和https运行不能共用一个端口。有点不明觉厉。。。这个时候我并没有运行http请求啊,不应该存在端口冲突啊。百思不得其解,所以,我就换个路径,把urllib换成了urllib2试了试。

def create(self, postData, accessToken):
postUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=%s" % accessToken
if isinstance(postData, unicode):
postData = postData.encode('utf-8')
urlResp = urllib2.urlopen(postUrl, data=postData)
print urlResp.read()

运行之后发现,好像有那没点不一样了,最起码错误类型不一样了,ssl错误不见了,变成了'ascii' codec can't decode byte 0xe9 in position 100: ordinal not in range(128)。这个错误算是比较常见的python编码错误了,python初始默认编码是ascii编码,在与其他编码进行转换时,中间采用unicode编码,就在这个过程中出现了错误:unicode编码最大只有128位,所以当尝试将ascii编码转换成unicode编码时出现了超出范围,不能编码的错误。知道了原因,就可以修改了。

在代码开始添加如下一段代码,作用是设置python默认编码为utf-8编码格式。

import sys
defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
reload(sys)
sys.setdefaultencoding(defaultencoding)

这样就不会存在转换编码格式错误的问题了。

这个方法仅仅针对单个文件起着作用,还可以在python安装文件的site-packages/目录下添加一个sitecustomize.py文件,内容如下:

import sys

sys.setdefaultencoding(defaultencoding)

这个针对所有文件都有效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐