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实现二叉搜索树
Feb 03 Python
python中如何使用正则表达式的集合字符示例
Oct 09 Python
详细解读tornado协程(coroutine)原理
Jan 15 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
Dec 05 Python
python tools实现视频的每一帧提取并保存
Mar 20 Python
python中break、continue 、exit() 、pass终止循环的区别详解
Jul 08 Python
Python with标签使用方法解析
Jan 17 Python
python实现超级马里奥
Mar 18 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
Sep 01 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
Sep 04 Python
python lambda的使用详解
Feb 26 Python
2021年最新用于图像处理的Python库总结
Jun 15 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
通过html表格发电子邮件
2006/10/09 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
2016/05/04 PHP
javascript编程起步(第四课)
2007/02/27 Javascript
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
JS实现左右拖动改变内容显示区域大小的方法
2015/10/13 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
angular4自定义组件详解
2017/09/28 Javascript
微信小程序实现手指触摸画板
2018/07/09 Javascript
详解从Vue-router到html5的pushState
2018/07/21 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
2019/05/22 Javascript
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
python中的常量和变量代码详解
2018/07/25 Python
Pytorch之finetune使用详解
2020/01/18 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
应届生新闻编辑求职信
2013/11/19 职场文书
高中体育教学反思
2014/01/29 职场文书
网上商城创业计划书范文
2014/01/31 职场文书
大二学生职业生涯规划书
2014/02/05 职场文书
英文求职信写作小建议
2014/02/16 职场文书
财产公证书样本
2014/04/04 职场文书
承租经营合作者协议书
2014/10/01 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
幼儿园春季开学通知
2015/07/16 职场文书
物资采购管理制度
2015/08/06 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
Java对文件的读写操作方法
2022/04/29 Java/Android