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的类方法和静态方法
Dec 13 Python
python数据抓取分析的示例代码(python + mongodb)
Dec 25 Python
python如何将图片转换为字符图片
Aug 19 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
python logging添加filter教程
Dec 24 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
Python callable内置函数原理解析
Mar 05 Python
Python xpath表达式如何实现数据处理
Jun 13 Python
Python Opencv轮廓常用操作代码实例解析
Sep 01 Python
python温度转换华氏温度实现代码
Dec 06 Python
Jupyter Notebook 远程访问配置详解
Jan 11 Python
Python 机器学习工具包SKlearn的安装与使用
May 14 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的控制语句
2006/10/09 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
php类中的各种拦截器用法分析
2014/11/03 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
php车辆违章查询数据示例
2016/10/14 PHP
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
JS模板实现方法
2013/04/03 Javascript
完美解决IE低版本不支持call与apply的问题
2013/12/05 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
AngularJS基础 ng-href 指令用法
2016/08/01 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
vue.js+Echarts开发图表放大缩小功能实例
2017/06/09 Javascript
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
Angular Material Icon使用详解
2018/11/07 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
基于python的七种经典排序算法(推荐)
2016/12/08 Python
Python中functools模块函数解析
2017/03/12 Python
python实现自主查询实时天气
2018/06/22 Python
python实现textrank关键词提取
2018/06/22 Python
Python使用MyQR制作专属动态彩色二维码功能
2019/06/04 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
python 动态绘制爱心的示例
2020/09/27 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
zooplus意大利:在线宠物商店
2019/08/07 全球购物
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
小学美术教学反思
2014/02/01 职场文书
毕业生评语大全
2015/01/04 职场文书
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫
正则表达式基础与常用验证表达式
2022/06/16 Javascript