python中urllib.unquote乱码的原因与解决方法

发现问题

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能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Python探索之URL Dispatcher实例详解

    URL dispatcher简单点理解就是根据URL,将请求分发到相应的方法中去处理,它是对URL和View的一个映射,它的实现其实也很简单,就是一个正则匹配的过程,事先定义好正则表达式和该正则表达式对应的view方法,如果请求的URL符合这个正则表达式,那么就分发这个请求到这个view方法中. 有了这个base,我们先抛出几个问题,提前思考一下: 这个映射定义在哪里?当映射很多时,如果有效的组织? URL中的参数怎么获取,怎么传给view方法? 如何在view或者是template中反解出UR

  • 【Python】Python的urllib模块、urllib2模块批量进行网页下载文件

    由于需要从某个网页上下载一些PDF文件,但是需要下载的PDF文件有几百个,所以不可能用人工点击来下载.正好Python有相关的模块,所以写了个程序来进行PDF文件的下载,顺便熟悉了Python的urllib模块和ulrllib2模块. 1.问题描述 需要从http://www.cvpapers.com/cvpr2014.html上下载几百个论文的PDF文件,该网页如下图所示: 2.问题解决 通过结合Python的urllib模块和urllib2模块来实现自动下载.代码如下: test.py #!

  • Python urls.py的三种配置写法实例详解

    urls.py的配置写法一般有三种方式. 1. 第一种是导入视图的方式,就是 The Django Book 里面样例的写法: from blog.views import index url(r'^nowamagic/', index)  2. 第二种方法是视图处理方法,看代码就知道是怎么回事了. url(r'^nowamagic/', 'test.views.index') 3. 第三种是把模型与视图写在前缀里. urlpatterns = patterns('blog.views', ur

  • Python 通过URL打开图片实例详解

    Python 通过URL打开图片实例详解 不论是用OpenCV还是PIL,skimage等库,在之前做图像处理的时候,几乎都是读取本地的图片.最近尝试爬虫爬取图片,在保存之前,我希望能先快速浏览一遍图片,然后有选择性的保存.这里就需要从url读取图片了.查了很多资料,发现有这么几种方法,这里做个记录. 本文用到的图片URL如下: img_src = 'http://wx2.sinaimg.cn/mw690/ac38503ely1fesz8m0ov6j20qo140dix.jpg' 1.用Open

  • Python爬取qq music中的音乐url及批量下载

    前言 qq music上的音乐还是不少的,有些时候想要下载好听的音乐,但有每次在网页下载都是烦人的登录什么的.于是,来了个qqmusic的爬虫.至少我觉得for循环爬虫,最核心的应该就是找到待爬元素所在url吧.下面开始找吧(讲的不对不要笑我) 实现如下 #寻找url: 这个url可不想其他的网站那么好找.把我给累得不轻,关键是数据多,从那么多数据里面挑出有用的数据,最后组合为music真正的music.昨天做的时候整理的几个中间url: #url1:https://c.y.qq.com/sos

  • python 使用get_argument获取url query参数

    python 使用get_argument获取url query参数 ornado的每个请求处理程序,我们叫做handler,handler里可以自定义自己的处理程序,其实也就是重写方法,如post,get,get_current_user,send_error等等,这里我们只讲get和post的自定义. 我们都知道,在Tornado里,获得用户的输入,都是一个get_argument搞定,似乎很顺理成章: def post(self): nowamagic = self.get_argumen

  • python中urllib.unquote乱码的原因与解决方法

    发现问题 Python中的urllib模块用来处理url相关的操作,unquote方法对应javascript中的urldecode方法,它对url进行解码,把类似"%xx"的字符替换成单个字符,例如:"%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92"解码后会转换成"法国红酒",但是使用过程中,如果姿势不对,最终转换出来的字符会是乱码"法国红é-". 笔者在一个真实的Tornado应用中就

  • python中不能连接超时的问题及解决方法

    要是我们大天朝的防火墙技术进步神速 解决方法 #只有修改pip源了. #临时使用: pip install pythonModuleName -i https://pypi.douban.com/simple #修改默认的软件源: #修改/etc/pip.conf 文件,即可为所有用户配置. liunx #修改~/.pip/pip.conf为当前用户配置. linux #windows下pip配置文件为 C:\Users\xx\pip\pip.ini ,没有就新建 最终变成了这样 •好的这就完成

  • Python中pyecharts安装及安装失败的解决方法

    pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 JS 库.这篇文章重点给大家介绍pyecharts安装失败的处理方法,具体详情如下: pyecharts库的安装 1.正常安装 首先在打开终端输入以下命令:pip install pyecharts 在终端输入pip list查看是否安装成功测试程序: from pyecharts.charts import Bar bar = Bar() bar.add_xaxis(["衬衫"

  • Python中的wordcloud库安装问题及解决方法

    今天下载wordcloud的时候出现了很多问题,在此总结总结 1.问题一:You are using pip version 19.0.3, however version 20.0.2 is available-问题 解决方法: 打开cmd输入如下命令 python -m pip install -U pip 2.问题二:error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual 解决方法: 方法1(不

  • Python中flask框架跨域问题的解决方法

    目录 一.跨域是什么 二.如何解决跨域问题 总结 一.跨域是什么 从一个域名去请求另一个域名,这个过程称之为跨域.浏览器从一个域名的网页去请求另一个域名的资源,域名.端口.协议有一个不一样,请求都属于跨域.跨域其实是浏览器的一个保护政策. 网页上有ajax请求时,会报:No 'Access-Control-Allow-Origin' header is present on the requested '这个错误. 二.如何解决跨域问题 1.跨域请求的过程 因此我们只要做到请求头部信息一致即可.

  • Java中java.lang.ClassCastException异常原因及解决方法

    通常我们在 OOP 设计中都会使用到继承. ​​但是在继承对象之间的强制转换可能会遇到​​java.lang.ClassCastException​​异常的错误. 错误的日志如下: 19:58:25.010 [http-nio-8080-exec-5] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw

  • 小结下MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法第1/3页

    乱码产生原因 mysql字符编码是版本4.1引入的,支持多国语言,而且一些特性已经超过了其他的数据库系统. 我们可以在MySQL Command Line Client 下输入如下命令查看mysql的字符集 mysql> SHOW CHARACTER SET; +----------+-----------------------------+---------------------+--------+ | Charset  | Description                 | De

  • PHP与MySQL开发中页面出现乱码的一种解决方法

    一般来说,乱码的出现有2种原因,首先是由于编码(charset)设置错误,导致浏览器以错误的编码来解析,从而出现了满屏乱七八糟的"天书",其次是文件被以错误的编码打开,然后保存,比如一个文本文件原先是GB2312编码的,却以UTF-8编码打开再保存.要解决上述乱码问题,首先需要知道开发中哪些环节涉及到了编码: 1.文件编码:指的是页面文件(.html,.php等)本身是以何种编码来保存的.记事本和Dreamweaver在打开页面时候会自动识别文件编码因而不太会出问题.而ZendStud

  • php中出现空白页的原因及解决方法汇总

    很多程序员在进行php开发的时候都遇到过出现空白页的请,综合分析来说,在php编程中出现空白页面可能是由以下几个原因造成的: 1.逻辑错误 逻辑错误是最难排除的,从表面上看,也许代码是合法的,是正规的,可运行起来却不是预料之中的.为什么呢?也许是编写者想得不够全面,毕竟人是人,计算机是计算机,计算机不可能完全按照人的思路去运行脚本.在这里,我告诉大家一个比较好的调试方法,就是使用注释符"/* */",注释掉一些代码,观察运行情况,以此来逐个排除错误,最终找到错误代码的位置.这种情况下要

  • asp.net中url字符串编码乱码的原因与解决方法

    先看实例 复制代码 代码如下: function webChart() {            var t = document.getElementById("txtReceive");            if (t.value == null || t.value == "") {                alert("请先进行查询");            }            else { alert(t.value);

随机推荐