python中urllib.unquote乱码的原因与解决方法


Posted in Python onApril 24, 2017

发现问题

Python中的urllib模块用来处理url相关的操作,unquote方法对应javascript中的urldecode方法,它对url进行解码,把类似"%xx"的字符替换成单个字符,例如:“%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92”解码后会转换成“法国红酒”,但是使用过程中,如果姿势不对,最终转换出来的字符会是乱码“法国红酔。

笔者在一个真实的Tornado应用中就遇到了这样的问题,浏览器通过请求传递到后台后,获取参数的值后:

name = self.get_argument("name", "")
name = urllib.unquote(name)
# save to db

name的值打印出来的显示的是:“%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92”,看起来没什么问题,但结果最终保存到数据库中的时候就成了一串乱码“法国红酔,这个问题实在是让人百思不得其解。

原因分析

于是想用直接编码的字符来处理看看是否会出现乱码:

name = '%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92'
name = urllib.unquote(name)
# save to db

发现这种方式处理没有任何问题,name的值解码之后就是“法国红酒”,经过一番思考,原因只可能是出在self.get_argument("name")这处代码段了。原来,get_argument默认返回的是值的类型是unicode,而unquote方法处理unicode类型的字符时,直接返回的就是:

u'\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92'

注意:这里返回的值类型是unicode,也就是说unquote方法接收参数类型是unidoe,返回的值类型也是unicode,只不过是把"%"替换成了'\x',最终由:

u"%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92"

替换为了:

u"\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92"

而u"\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92"完全就是一个ascii码字符串,只不过是用16进制表示的,我们再来看看'e6','b3'....分别对应ascii中的什么字符。你可以参考网址:http://www.ascii-code.com,'e6'是一个扩展的ascii字符,在128-255区间范围内,他对应的符号就是'æ'

DEC OCT HEX BIN Symbol 
230 346 E6 11100110 æ

现在你应该明白为什么会生成乱码字符:

法国红é

解决办法

在调用self.get_argument('name')方法之后,把返回的值转换成str类型:

name = self.get_argument("name", "")
name = str(name)
name = urllib.unquote(name)
# save to db

转换称str类型的字符串之后,相当于调用:

'\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92'.decode("utf-8")

>>> u'\u6cd5\u56fd\u7ea2\u9152'

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python私有属性和方法实例分析
Jan 15 Python
使用pdb模块调试Python程序实例
Jun 02 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
django之常用命令详解
Jun 30 Python
python的unittest测试类代码实例
Dec 07 Python
Python3多线程操作简单示例
May 22 Python
在IPython中进行Python程序执行时间的测量方法
Nov 01 Python
Python实现合并两个有序链表的方法示例
Jan 31 Python
python使用正则表达式(Regular Expression)方法超详细
Dec 30 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
Python根据字典的值查询出对应的键的方法
Sep 30 Python
pandas使用函数批量处理数据(map、apply、applymap)
Nov 27 Python
Python面向对象特殊成员
Apr 24 #Python
Python解惑之整数比较详解
Apr 24 #Python
Python解惑之True和False详解
Apr 24 #Python
Python新手入门最容易犯的错误总结
Apr 24 #Python
Python正则抓取新闻标题和链接的方法示例
Apr 24 #Python
Python的爬虫框架scrapy用21行代码写一个爬虫
Apr 24 #Python
fastcgi文件读取漏洞之python扫描脚本
Apr 23 #Python
You might like
?繁体转换的class
2006/10/09 PHP
php中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
Javascript中的迭代、归并方法详解
2016/06/14 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
微信小程序 require机制详解及实例代码
2016/12/14 Javascript
javascript 删除数组元素和清空数组的简单方法
2017/02/24 Javascript
微信小程序 登录的简单实现
2017/04/19 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
Python 变量类型及命名规则介绍
2013/06/08 Python
使用Python开发windows GUI程序入门实例
2014/10/23 Python
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
python动态网页批量爬取
2016/02/14 Python
详解Python文本操作相关模块
2017/06/22 Python
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
英国手机零售商:Metrofone
2019/03/18 全球购物
单位领导证婚词
2014/01/14 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
卖房协议书
2014/04/11 职场文书
给学校的建议书范文
2014/05/15 职场文书
优秀实习生主要事迹
2014/05/29 职场文书
个人安全生产责任书
2014/07/28 职场文书
学校周年庆活动方案
2014/08/22 职场文书
Python制作动态字符画的源码
2021/08/04 Python
JavaScript文档对象模型DOM
2021/11/20 Javascript