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 相关文章推荐
rhythmbox中文名乱码问题解决方法
Sep 06 Python
基python实现多线程网页爬虫
Sep 06 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
python判断数字是否是超级素数幂
Sep 27 Python
Python爬虫之正则表达式的使用教程详解
Oct 25 Python
Python pandas.DataFrame 找出有空值的行
Sep 09 Python
Numpy将二维数组添加到空数组的实现
Dec 05 Python
python3 配置logging日志类的操作
Apr 08 Python
python使用hdfs3模块对hdfs进行操作详解
Jun 06 Python
Python基于字典实现switch case函数调用
Jul 22 Python
Python识别验证码的实现示例
Sep 30 Python
python实现经典排序算法的示例代码
Feb 07 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中去除所有js,html,css代码
2010/10/12 PHP
php-fpm中max_children的配置
2019/03/15 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
2019/09/08 PHP
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
AngularJS中$interval的用法详解
2016/02/02 Javascript
移动端js图片查看器
2016/11/17 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
Vue使用axios出现options请求方法
2019/05/30 Javascript
如何进行微信公众号开发的本地调试的方法
2019/06/16 Javascript
微信小程序wxs实现吸顶效果
2020/01/08 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
python结合selenium获取XX省交通违章数据的实现思路及代码
2016/06/26 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
Python requests获取网页常用方法解析
2020/02/20 Python
设置jupyter中DataFrame的显示限制方式
2020/04/12 Python
python try...finally...的实现方法
2020/11/25 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
Python的logging模块基本用法
2020/12/24 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
详解rem 适配布局
2018/10/31 HTML / CSS
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
工作自我评价分享
2013/12/01 职场文书
大学毕业自我评价
2014/02/02 职场文书
项目建议书格式
2014/03/12 职场文书
2015年房产销售工作总结范文
2015/05/22 职场文书
Python基础知识之变量的详解
2021/04/14 Python
javascript函数式编程基础
2021/09/15 Javascript
Java生成日期时间存入Mysql数据库的实现方法
2022/03/03 Java/Android