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 相关文章推荐
zookeeper python接口实例详解
Jan 18 Python
对numpy数据写入文件的方法讲解
Jul 09 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
Jul 26 Python
Python分支语句与循环语句应用实例分析
May 07 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
python SQLAlchemy的Mapping与Declarative详解
Jul 04 Python
django如何通过类视图使用装饰器
Jul 24 Python
Python tkinter三种布局实例详解
Jan 06 Python
Pytorch自己加载单通道图片用作数据集训练的实例
Jan 18 Python
在matplotlib中改变figure的布局和大小实例
Apr 23 Python
基于python实现音乐播放器代码实例
Jul 01 Python
python获取百度热榜链接的实例方法
Aug 25 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 magic quotes的详解
2013/06/17 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
解析jquery中的ajax缓存问题
2013/12/19 Javascript
jQuery Validate 验证,校验规则写在控件中的具体实例
2014/02/27 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
自定义Vue组件打包、发布到npm及使用教程
2019/05/22 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
2019/07/03 jQuery
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
videocapture库制作python视频高速传输程序
2013/12/23 Python
python创建进程fork用法
2015/06/04 Python
python批量获取html内body内容的实例
2019/01/02 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
HTML5 CSS3打造相册效果附源码下载
2014/06/16 HTML / CSS
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
波兰在线运动商店:YesSport
2020/07/23 全球购物
一篇.NET面试题
2014/09/29 面试题
学前班评语大全
2014/05/04 职场文书
小学生春游活动方案
2014/08/20 职场文书
六一儿童节主持开场白
2015/05/28 职场文书
毕业晚宴祝酒词
2015/08/11 职场文书
七年级英语教学反思
2016/02/15 职场文书
Python中如何处理常见报错
2022/01/18 Python