全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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


# 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函数使用实例解析  # 的是  # 法国  # 转换成  # 是一个  # 让人  # 成了  # 你可以  # 只不过是  # 没有任何  # 这个问题  # 再来  # 百思不得其解  # 你应该  # 这篇文章  # 谢谢大家  # 后会  # 想用  # 中就  # 是否会  # 解决办法 


相关文章: 已有域名和空间如何搭建网站?  安徽网站建设与外贸建站服务专业定制方案  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何快速使用云服务器搭建个人网站?  济南企业网站制作公司,济南社保单位网上缴费步骤?  C#如何序列化对象为XML XmlSerializer用法  表情包在线制作网站免费,表情包怎么弄?  定制建站是什么?如何实现个性化需求?  香港服务器如何优化才能显著提升网站加载速度?  如何用PHP工具快速搭建高效网站?  如何选择可靠的免备案建站服务器?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  如何在宝塔面板创建新站点?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  制作网站外包平台,自动化接单网站有哪些?  建站VPS选购需注意哪些关键参数?  jQuery 常见小例汇总  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何做静态网页,sublimetext3.0制作静态网页?  香港服务器部署网站为何提示未备案?  建站上传速度慢?如何优化加速网站加载效率?  如何快速搭建高效WAP手机网站?  高防服务器租用如何选择配置与防御等级?  建站之星如何实现网站加密操作?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  网站制作公司排行榜,抖音怎样做个人官方网站  设计网站制作公司有哪些,制作网页教程?  如何在Windows服务器上快速搭建网站?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  如何在万网开始建站?分步指南解析  宁波免费建站如何选择可靠模板与平台?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  建站之星备案流程有哪些注意事项?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何打造高效商业网站?建站目的决定转化率  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何在橙子建站上传落地页?操作指南详解  想学网站制作怎么学,建立一个网站要花费多少?  网站制作服务平台,有什么网站可以发布本地服务信息?  如何选择域名并搭建高效网站?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  制作宣传网站的软件,小红书可以宣传网站吗?  建站之星客服服务时间及联系方式如何?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。