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中max函数用法实例分析
Jul 17 Python
Queue 实现生产者消费者模型(实例讲解)
Nov 13 Python
对Python通过pypyodbc访问Access数据库的方法详解
Oct 27 Python
对Python中创建进程的两种方式以及进程池详解
Jan 14 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
Apr 15 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 Python
python实现将字符串中的数字提取出来然后求和
Apr 02 Python
Python实现一个简单的递归下降分析器
Aug 01 Python
浅析python中的del用法
Sep 02 Python
Django用内置方法实现简单搜索功能的方法
Dec 18 Python
PyTorch dropout设置训练和测试模式的实现
May 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
过滤掉PHP数组中的重复值的实现代码
2011/07/17 PHP
php实现的xml操作类
2016/01/15 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
js实现楼层导航功能
2017/02/23 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
2019/03/28 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
小程序实现tab标签页
2020/11/16 Javascript
Python实现的归并排序算法示例
2017/11/21 Python
python下载微信公众号相关文章
2019/02/26 Python
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
2020/10/10 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
网站开发实习生的自我评价
2013/12/11 职场文书
《阳光》教学反思
2014/02/23 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
七夕情人节促销方案
2014/06/07 职场文书
标准毕业生自荐信
2014/06/24 职场文书
不听老师话的万能检讨书
2014/10/04 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python
MySQL 聚合函数排序
2021/07/16 MySQL