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获得linux下所有挂载点(mount points)的方法
Apr 29 Python
Python实现线程池代码分享
Jun 21 Python
python threading和multiprocessing模块基本用法实例分析
Jul 25 Python
使用虚拟环境打包python为exe 文件的方法
Aug 29 Python
python模拟实现斗地主发牌
Jan 07 Python
如何将PySpark导入Python的放实现(2种)
Apr 26 Python
python交互模式基础知识点学习
Jun 18 Python
通过实例解析python创建进程常用方法
Jun 19 Python
详解python os.path.exists判断文件或文件夹是否存在
Nov 16 Python
python 实现控制鼠标键盘
Nov 27 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
如何用python插入独创性声明
Mar 31 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
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
2013/06/21 PHP
详谈PHP编码转换问题
2015/07/28 PHP
PHP session 会话处理函数
2016/06/06 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
jQuery $.extend()用法总结
2014/06/15 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
Bootstrap导航条学习使用(一)
2017/02/08 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
微信小程序下拉菜单效果的实例代码
2019/05/14 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
python 根据pid杀死相应进程的方法
2017/01/16 Python
ubuntu安装mysql pycharm sublime
2018/02/20 Python
python字符串string的内置方法实例详解
2018/05/14 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
Python-opencv 双线性插值实例
2020/01/17 Python
巴西婴儿用品商店:Bebe Store
2017/11/23 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
2013/02/17 面试题
实习生的自我评价
2014/01/08 职场文书
外国人聘用意向书
2014/04/01 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
内勤岗位职责
2015/02/10 职场文书
2015年酒店服务员工作总结
2015/05/18 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技