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使用win32com在百度空间插入html元素示例
Feb 20 Python
Python操作串口的方法
Jun 17 Python
详解Python的Django框架中manage命令的使用与扩展
Apr 11 Python
python操作redis方法总结
Jun 06 Python
Python实现决策树并且使用Graphviz可视化的例子
Aug 09 Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 Python
使用Python实现 学生学籍管理系统
Nov 26 Python
python随机模块random使用方法详解
Feb 14 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
你需要学会的8个Python列表技巧
Jun 24 Python
python装饰器三种装饰模式的简单分析
Sep 04 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 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/06/28 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
如何打开php的gd2库
2017/02/09 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
js 代码集(学习js的朋友可以看下)
2009/07/22 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
javascript  数组排序与对象排序的实例
2017/07/17 Javascript
详解A标签中href=""的几种用法
2017/08/20 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
JavaScript 判断浏览器是否是IE
2021/02/19 Javascript
python通过shutil实现快速文件复制的方法
2015/03/14 Python
python根据京东商品url获取产品价格
2015/08/09 Python
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
Python连接phoenix的方法示例
2017/09/29 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
使用Python处理BAM的方法
2018/09/28 Python
python执行精确的小数计算方法
2019/01/21 Python
在django中,关于session的通用设置方法
2019/08/06 Python
Python实现元素等待代码实例
2019/11/11 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
常务副总经理任命书
2014/06/05 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
党小组鉴定意见
2015/06/02 职场文书
宣传稿格式范文
2015/07/23 职场文书