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时间获取及转换知识汇总
Jan 11 Python
python编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 Python
Python模块文件结构代码详解
Feb 03 Python
pytorch + visdom 处理简单分类问题的示例
Jun 04 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
python中aioysql(异步操作MySQL)的方法
Apr 11 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
Jun 26 Python
PIL图像处理模块paste方法简单使用详解
Jul 17 Python
Pandas分组与排序的实现
Jul 23 Python
在tensorflow中设置保存checkpoint的最大数量实例
Jan 21 Python
Python通过Pillow实现图片对比
Apr 29 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
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
统计jQuery中各字符串出现次数的工具
2012/05/03 Javascript
关于jquery的多个选择器的使用示例
2013/10/18 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
JS随机洗牌算法之数组随机排序
2016/03/23 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
2018/02/08 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
js正则取值的结果数组调试方法
2018/10/10 Javascript
vue-cli V3.0版本的使用详解
2018/10/24 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
JS自定义对象创建与简单使用方法示例
2020/01/15 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
[02:47]3.19DOTA2发布会 国服成长历程回顾
2014/03/25 DOTA
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
Python编写屏幕截图程序方法
2015/02/18 Python
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
Python中一般处理中文的几种方法
2019/03/06 Python
Python实现Linux监控的方法
2019/05/16 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
CSS3实现多样的边框效果
2018/05/04 HTML / CSS
介绍一下Java中的static关键字
2012/05/12 面试题
物流专业求职信
2014/06/30 职场文书
《观察物体》教学反思
2016/02/17 职场文书
《迟到》教学反思
2016/02/24 职场文书
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers