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代码
Mar 13 Python
py2exe 编译ico图标的代码
Mar 08 Python
python网络编程学习笔记(五):socket的一些补充
Jun 09 Python
Python 获取新浪微博的最新公共微博实例分享
Jul 03 Python
Python实现竖排打印传单手机号码易撕条
Mar 16 Python
浅析Python中的多条件排序实现
Jun 07 Python
python里 super类的工作原理详解
Jun 19 Python
安装完Python包然后找不到模块的解决步骤
Feb 13 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
python使用pyecharts库画地图数据可视化的实现
Mar 25 Python
Ubuntu中配置TensorFlow使用环境的方法
Apr 21 Python
用Python创建简易网站图文教程
Jun 11 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
无限级别菜单的实现
2006/10/09 PHP
PHP网上调查系统
2006/10/09 PHP
MySQL连接数超过限制的解决方法
2011/07/17 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
php牛逼的面试题分享
2013/01/18 PHP
php使用curl访问https示例分享
2014/01/17 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
2015/05/18 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
Bootstrap轮播插件使用代码
2016/10/11 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
微信小程序如何修改本地缓存key中单个数据的详解
2019/04/26 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
简单介绍Python中的readline()方法的使用
2015/05/24 Python
Python中你应该知道的一些内置函数
2017/03/31 Python
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
自动化毕业生专业自荐书范文
2014/02/04 职场文书
酒鬼酒广告词
2014/03/21 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
数学备课组工作总结
2015/08/12 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技
Spring boot实现上传文件到本地服务器
2022/08/14 Java/Android