1.
py2需要
import urllib
py3需要
import urllib.parse
以下不特殊说明显示的都是py3的结果,编码之后的字符串可以到一些站长网站去解码校验
2.
quote_plus用于对字符串编码
>>> quote_plus('中文') '%E4%B8%AD%E6%96%87'
可适用场景,get方式的请求参数需要传入urlencoded json字符串
>>> d = {'a':'a','b':u'b'} >>> d {'a': 'a', 'b': 'b'} >>> dstr = json.dumps(d) >>> dstr '{"a": "a", "b": "b"}' >>> quote_plus(dstr) '%7B%22a%22%3A+%22a%22%2C+%22b%22%3A+%22b%22%7D'
最后得到的dstr就是可以串联到请求url后面的字符串,
此处用json.dumps(),而不用str(),是因为json.dumps会将单引号转化成json标准的双引号,同时对于py2,如果出现了u'a'这样的unicode字符串,也会自动去除前缀u。
其实此处quote的作用就是对 { " }和空格之类的做编码,所以对于中文,json.dumps()会处理成类似\u4e2d 这样的字符串,再进行quote也只是%5Cu4e2d,因为 \ 对应的编码是 %5C,至于这样编码的字符串可不可以处理可能还得看服务端。
>>> zw = {'zw':'中文'} >>> json.dumps(zw) '{"zw": "\\u4e2d\\u6587"}' >>> quote_plus(json.dumps(zw)) '%7B%22zw%22%3A+%22%5Cu4e2d%5Cu6587%22%7D'
如果需要统一成UTF-8的格式,py3其实是很容易的
>>> d {'a': 'a', 'b': '中文'} >>> quote_plus(str(d).replace("'", '"')) '%7B%22a%22%3A+%22a%22%2C+%22b%22%3A+%22%E4%B8%AD%E6%96%87%22%7D'
但是并不适用于py2,以下直接给出兼容的function(只考虑dict value可能是中文的情况,并且统一unicode编码)
def dict_to_quote_str(dict_param): # encode出来的字符串是\xe3d4这样的,所以再quote tmp_dict = {k: quote_plus(v.encode('utf-8')) for (k, v) in d.items()} tmp_str = json.dumps(tmp_dict) if sys.version_info[0] == 3: return urllib.parse.quote_plus(tmp_str, safe='/%') else: return urllib.quote_plus(tmp_str, safe='/%')
分步试验过程
>>> d {'a': 'a', 'b': '中文'} >>> tmp_dict = {k: v.encode('utf-8') for (k, v) in d.items()} >>> tmp_dict {'a': b'a', 'b': b'\xe4\xb8\xad\xe6\x96\x87'} >>> tmp_dict = {k: quote_plus(v.encode('utf-8')) for (k, v) in d.items()} >>> tmp_dict {'a': 'a', 'b': '%E4%B8%AD%E6%96%87'} >>> jstr = json.dumps(tmp_dict) >>> jstr '{"a": "a", "b": "%E4%B8%AD%E6%96%87"}' >>> quote_plus(jstr, safe='/%') '%7B%22a%22%3A+%22a%22%2C+%22b%22%3A+%22%E4%B8%AD%E6%96%87%22%7D'
3.
urlencode可以将dict转成k1=v1&k2=v2这样的字符串
>>> d {'a': 'a', 'b': '中文'} >>> urlencode(d) 'a=a&b=%E4%B8%AD%E6%96%87'
但是到了py2继续歇菜,表现在两点:
1)如果是使用unicode定义dict的value,urlencode无法解析,出现UnicodeEncodeError
2)如果直接像py3那样定义dict的value,urlencode的结果就跟系统有关了,Windows里面得到的就是gbk编码的
(以下为py2运行环境)
首先考虑第一种情况
>>> d={'a': 'a', 'b': u'中文'} >>> d {'a': 'a', 'b': u'\u4e2d\u6587'} >>> urlencode({k:v.encode('utf-8') for k,v in d.items()}) 'a=a&b=%E4%B8%AD%E6%96%87'
对于第二种情况
>>> d={'a': 'a', 'b': '中文'} >>> d {'a': 'a', 'b': '\xd6\xd0\xce\xc4'} >>> dd={k:v.decode('gbk') for k,v in d.items()} >>> dd {'a': u'a', 'b': u'\u4e2d\u6587'} >>> urlencode({k:v.decode('gbk').encode('utf-8') for k,v in d.items()}) 'a=a&b=%E4%B8%AD%E6%96%87'
相关推荐
自己写的,可能有bug,请大家一块学习 环境为PB12 函数(及参数) 作用 arraysort 对一维数组进行排序 decto 将十进制数字转成其它进制字符串 ...urlencode 将指定字符串以进行指定字符集url编码 涨价了,哈哈
主要介绍了Python3的urllib.parse常用函数,结合实例形式分析了urlencode,quote,quote_plus,unquote,unquote_plus等函数的相关使用技巧,需要的朋友可以参考下
一、简介 在python中url,对于中文等非ascii码字符,需要进行...urlencode(query, doseq=False, safe=”, encoding=None, errors=None, quote_via=quote_plus)方法。 2、url解码 解码用urllib.parse包下的unquote(stri
易语言URL编解码源码,URL编解码,URLEncode,URLDecode
base64_encode urlencode 源码,可以根据需求稍作修改便能实现功能
UrlEncodeUrlDecodeUrl解码Url编码工具 基于UrlEncode,UrlDecode的解码编码工具,支持双向。
urlEncode or urlDecode
J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码
基于UrlEncode,UrlDecode的解码编码工具,支持双向。
本文用C++来实现UrlEncode!
URLEncode 转换编码。
UrlEncode编码转换.zip
JS版 UrlEncode 和 UrlDecode 函数
urlencode urldecode实现,在xcode里使用c++混编
前段时间,在做一个采集插件的时候,出现了一个问题。 浏览器网址后面带的get参数值含有中文的时候,在php里面获取字符串并且进行urlencode处理的时候,不同的浏览器,urlencode函数转换后的结果不一样。 原来...
URL编码解码工具(URLEnCodeURLDeCode) 非常好用~ 下载使用
js以utf-8对中文字符编码有现成的函数,但js 以GBK对中文字符编码却没有,这里就提供给大家,希望对大家有帮助
但是找遍了精易模块和百度都没有说有这这个命令 让Unicode字符串(易语言里面以字节集表示)直接进行正确的URL编码 所以就自己写了一个JavaScript脚本 进行URL编码 原理就是先把unicode字符串转换成BASE64编码文本 ...
今天小编就为大家分享一篇Python3中urlencode和urldecode的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧