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 Mysql数据库操作 Perl操作Mysql数据库
Jan 12 Python
python中threading超线程用法实例分析
May 16 Python
使用python3构建文件传输的方法
Feb 13 Python
python openpyxl使用方法详解
Jul 18 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
Sep 16 Python
如何基于python实现脚本加密
Dec 28 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
python软件都是免费的吗
Jun 18 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
Jul 15 Python
python 实现批量图片识别并翻译
Nov 02 Python
python 用struct模块解决黏包问题
Nov 07 Python
Jupyter Notebook安装及使用方法解析
Nov 12 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
使用php来实现网络服务
2009/09/15 PHP
Javascript中的数学函数
2007/04/04 Javascript
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
细品javascript 寻址,闭包,对象模型和相关问题
2009/04/27 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
Nodejs中使用phantom将html转为pdf或图片格式的方法
2017/09/18 NodeJs
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
js实现验证码干扰(动态)
2021/02/23 Javascript
[03:27]《辉夜杯》线下训练营 导师CU和海涛指点迷津
2015/10/23 DOTA
Python sys.path详细介绍
2013/10/17 Python
django实现前后台交互实例
2017/08/07 Python
Python 字符串换行的多种方式
2018/09/06 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
Python assert关键字原理及实例解析
2019/12/13 Python
基于python3生成标签云代码解析
2020/02/18 Python
使用Python实现批量ping操作方法
2020/05/06 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
通过CSS3的object-fit来调整图片适配尺寸的技巧简介
2016/02/27 HTML / CSS
阿根廷票务网站:StubHub阿根廷
2018/04/13 全球购物
直接有效的自我评价
2014/01/11 职场文书
青年文明号事迹材料
2014/01/18 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
坎儿井导游词
2015/02/09 职场文书
勇敢的心观后感
2015/06/09 职场文书
实习证明格式范文
2015/06/16 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
Redis分布式锁Redlock的实现
2021/08/07 Redis