`
xuanzhui
  • 浏览: 200580 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

用quote_plus和urlencode做url编码

阅读更多

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'

 

 

分享到:
评论

相关推荐

    PB 进制转换 url编码 urlencode urldecode 数组排序

    自己写的,可能有bug,请大家一块学习 环境为PB12 函数(及参数) 作用 arraysort 对一维数组进行排序 decto 将十进制数字转成其它进制字符串 ...urlencode 将指定字符串以进行指定字符集url编码 涨价了,哈哈

    Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)

    在Python3中,`urllib.parse`模块是一个用于解析URL和构建URL的工具包,它包含了一系列函数,如`urlencode`、`quote`、`quote_plus`、`unquote`和`unquote_plus`,这些函数在处理URL的编码和解码时非常有用。...

    对python中url参数编码与解码的实例详解

    一、简介 在python中url,对于中文等非ascii码字符,需要进行...urlencode(query, doseq=False, safe=”, encoding=None, errors=None, quote_via=quote_plus)方法。 2、url解码 解码用urllib.parse包下的unquote(stri

    base64_encode and urlencode

    `base64_encode`通常用于编码二进制数据,使得数据可以在文本环境中安全传递,而`urlencode`则专注于处理URL中的特殊字符,保证URL的有效性和可读性。尽管它们都可以将二进制数据转化为可打印的字符,但适用的场景和...

    易语言URL编解码

    这个源码文件应该包含了具体的代码实现,你可以从中学习到易语言处理字符串和编码的具体方法,以及如何构建这类实用的网络编程工具。同时,通过调试和修改源码,你还可以加深对URL编解码原理的理解,并提升自己的...

    urlEncode or urlDecode

    - 在进行URL编码时,要考虑URL编码规范,避免使用不标准的编码方式,以保证跨平台和跨浏览器的兼容性。 - URL编码是安全的,因为它只是替换特殊字符,并不会改变其含义,但在进行URL编码和解码时,仍需警惕潜在的XSS...

    UrlEncodeUrlDecodeUrl解码Url编码工具

    在互联网世界中,数据传输时常会遇到字符集和编码格式的问题。UrlEncodeUrlDecodeUrl解码Url编码工具正是为了解决这一问题而设计的。它是一个实用的小工具,能够帮助用户对URL进行编码和解码,确保数据在通过网络...

    urlencode urldecode实现

    同时,实现 `urlencode` 和 `urldecode` 的具体算法时,需要注意字符编码规则,确保所有可能的URL特殊字符都被正确处理。 总结来说,`urlencode` 和 `urldecode` 在网络编程中扮演着重要角色,特别是在处理URL参数...

    用C++来实现UrlEncode

    本文将深入探讨如何使用C++语言实现URL编码(UrlEncode)功能。URL编码是一种用于处理URL中特殊字符的技术,确保它们能在互联网上安全传输。在C++中实现这一功能涉及到对字符串的遍历、字符识别以及ASCII码与十六...

    UrlEncodeDecode解码编码工具(双向)

    而独立的工具则提供了跨平台、跨语言的解决方案,无论你使用何种技术栈,都可以快速进行URL的编码和解码。 总的来说,"UrlEncodeDecode解码编码工具"是一个实用的辅助工具,对于那些经常处理URL编码和解码问题的人...

    URLEncode 字符编码转换

    在C++中,你可以使用`std::wstring_convert`和`std::codecvt_utf8`来实现URL编码和解码,或者使用第三方库如Poco或Boost等,它们提供了方便的接口。然而,需要注意的是,`std::wstring_convert`在C++17中已被弃用,...

    UrlEncode编码转换.zip

    在Python中,可以使用`urllib.parse.quote()`和`urllib.parse.unquote()`。在处理这些函数时,要注意编码和解码的上下文,以防止不必要的错误或安全问题,比如SQL注入。 文件名"URLencode_gr"可能是关于希腊语(gr...

    MFC中将普通的字符串转成urlencode格式

    在本篇文章中,我们将深入探讨如何在MFC(Microsoft Foundation Classes)框架中实现字符串到URL编码(即urlencode格式)的转换。此过程涉及到对字符进行特定格式化处理,以便它们能够在URL中安全传输。 ### MFC...

    C++URL编码和解码

    在IT领域,URL编码和解码是网络编程中不可或缺的一部分,特别是在使用HTTP协议进行通信时。C++作为一门强大的系统级编程语言,虽然没有内置的URL编码和解码函数,但开发者可以借助标准库和第三方库来实现这些功能。...

    J2ME 实现的 UrlEncode编码

    J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码

    vb url编码解码vb url编码解码vb url编码解码

    标题和描述中提到的“vb url编码解码”是指在Visual Basic(VB)环境中进行URL编码和解码的过程。URL编码,也称为百分号编码,是一种用于将特殊字符转换为适用于URL格式的编码方式,目的是确保这些特殊字符能够正确...

    C#自动识别URL编码,asp.net自动识别URL编码

    解决方法是在发送请求前使用`UrlEncode`对查询字符串进行编码,或者在接收时使用`UrlDecode`进行解码。 - **编码与解码不匹配**: 如果编码使用的编码方式与解码时的编码方式不一致,也可能导致乱码。确保始终使用...

    url编码转化,将url转化成unicode进行传输

    2. **跨平台兼容性**:不同的系统和浏览器可能使用不同的编码方式,统一使用URL编码可以提高兼容性。 3. **安全性**:防止注入攻击,确保数据安全传输。 4. **标准化**:遵循国际标准,使得数据可以在全球范围内被...

    url加密URL编码 如“exit”编码为“%65%78%69%74”.zip

    在C#编程语言中,处理URL编码可以使用内置的`Uri.EscapeDataString()`或`HttpUtility.UrlEncode()`方法。`Uri.EscapeDataString()`用于对URI数据部分进行编码,而`HttpUtility.UrlEncode()`更适用于HTTP上下文中的...

Global site tag (gtag.js) - Google Analytics