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

发布时间 - 2026-01-11 00:48:07    点击率:

发现问题

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  # unquote  # 乱码  # urllib  # urllib.unquote  # 解决python 3 urllib 没有 urlencode 属性的问题  # Python3中urlencode和urldecode的用法详解  # Python2和Python3中urllib库中urlencode的使用注意事项  # Python3的urllib.parse常用函数小结(urlencode  # quote  # quote_plus  # unquote_plus等)  # Python urlencode和unquote函数使用实例解析  # 的是  # 法国  # 转换成  # 是一个  # 让人  # 成了  # 你可以  # 只不过是  # 没有任何  # 这个问题  # 再来  # 百思不得其解  # 你应该  # 这篇文章  # 谢谢大家  # 后会  # 想用  # 中就  # 是否会  # 解决办法 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Java垃圾回收器的方法和原理总结  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Bootstrap整体框架之JavaScript插件架构  如何在阿里云通过域名搭建网站?  无锡营销型网站制作公司,无锡网选车牌流程?  Laravel如何生成URL和重定向?(路由助手函数)  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Bootstrap整体框架之CSS12栅格系统  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  QQ浏览器网页版登录入口 个人中心在线进入  如何快速搭建高效可靠的建站解决方案?  Laravel如何使用Collections进行数据处理?(实用方法示例)  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  如何获取免费开源的自助建站系统源码?  微信小程序 wx.uploadFile无法上传解决办法  什么是javascript作用域_全局和局部作用域有什么区别?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  中山网站制作网页,中山新生登记系统登记流程?  如何用AWS免费套餐快速搭建高效网站?  Firefox Developer Edition开发者版本入口  如何在搬瓦工VPS快速搭建网站?  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  详解CentOS6.5 安装 MySQL5.1.71的方法  如何快速搭建虚拟主机网站?新手必看指南  如何快速上传自定义模板至建站之星?  Python文件操作最佳实践_稳定性说明【指导】  javascript读取文本节点方法小结  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  如何在IIS中新建站点并配置端口与物理路径?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  html如何与html链接_实现多个HTML页面互相链接【互相】  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  如何在Windows环境下新建FTP站点并设置权限?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Laravel distinct去重查询_Laravel Eloquent去重方法  敲碗10年!Mac系列传将迎来「触控与联网」双革新  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  如何在企业微信快速生成手机电脑官网?