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实现的系统实用log类实例
Jun 30 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
python通过ffmgep从视频中抽帧的方法
Dec 05 Python
pandas数据筛选和csv操作的实现方法
Jul 02 Python
深入了解Python iter() 方法的用法
Jul 11 Python
Django用户认证系统 组与权限解析
Aug 02 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
Nov 29 Python
Python文件操作方法详解
Feb 09 Python
Django用户登录与注册系统的实现示例
Jun 03 Python
Django ModelForm组件原理及用法详解
Oct 12 Python
python对输出的奇数偶数排序实例代码
Dec 04 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
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
同时提取多条新闻中的文本一例
2006/10/09 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
2015/05/12 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
Javascript 对象的解释
2008/11/24 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
JavaScript获得页面base标签中url的方法
2015/04/03 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
Node.js测试中的Mock文件系统详解
2016/11/21 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
微信小程序实现折线图的示例代码
2019/06/07 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
让Python代码更快运行的5种方法
2015/06/21 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
python按比例随机切分数据的实现
2019/07/11 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
python IDLE添加行号显示教程
2020/04/25 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
联想台湾官网:Lenovo TW
2018/05/09 全球购物
销售员自我评价怎么写
2013/09/19 职场文书
高一学生期末评语
2014/04/25 职场文书
爱心捐助倡议书
2014/05/19 职场文书
2015年新学期寄语
2015/02/26 职场文书
学校远程教育工作总结
2015/08/11 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书
css3应用示例:新增的选择器
2022/03/16 HTML / CSS
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python