这里有新鲜出炉的 Python3 官方中文指南,程序狗速度看过来!
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
这篇文章主要给大家介绍了 python 中 urllib.unquote 乱码的原因与解决方法,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友可以参考学习,下面跟着小编一起来学习学习吧。
发现问题
Python 中的 urllib 模块用来处理 url 相关的操作,unquote 方法对应 javascript 中的 urldecode 方法,它对 url 进行解码,把类似 "%xx" 的字符替换成单个字符,例如:"法国红酒" 解码后会转换成 "法国红酒",但是使用过程中,如果姿势不对,最终转换出来的字符会是乱码 "法国红é…"。
笔者在一个真实的 Tornado 应用中就遇到了这样的问题,浏览器通过请求传递到后台后,获取参数的值后:
- name = self.get_argument("name", "")
- name = urllib.unquote(name)
- # save to db
name 的值打印出来的显示的是:"法国红酒",看起来没什么问题,但结果最终保存到数据库中的时候就成了一串乱码 "法国红é…",这个问题实在是让人百思不得其解。
原因分析
于是想用直接编码的字符来处理看看是否会出现乱码:
- name = '法国红酒'
- name = urllib.unquote(name)
- # save to db
发现这种方式处理没有任何问题,name 的值解码之后就是 "法国红酒",经过一番思考,原因只可能是出在
这处代码段了。原来,get_argument 默认返回的是值的类型是 unicode,而 unquote 方法处理 unicode 类型的字符时,直接返回的就是:
- self.get_argument("name")
- u'\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92'
注意:这里返回的值类型是 unicode,也就是说 unquote 方法接收参数类型是 unidoe,返回的值类型也是 unicode,只不过是把 "%" 替换成了'\x',最终由:
- u"法国红酒"
替换为了:
- 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 æ
现在你应该明白为什么会生成乱码字符:
- 法国红é
解决办法
在调用
方法之后,把返回的值转换成 str 类型:
- self.get_argument('name')
- 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 能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对 PHPERZ 的支持。
来源: http://www.phperz.com/article/17/0513/334880.html