Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python RFC 3986的urlencode()_Python_Python 3.x_Urlencode - Fatal编程技术网

Python RFC 3986的urlencode()

Python RFC 3986的urlencode(),python,python-3.x,urlencode,Python,Python 3.x,Urlencode,Python有一个很棒的函数,它通过RFC1738(加上编码)对dict进行编码: 我找不到使用RFC 3986(百分比编码)的替代品,即使精细手册: RFC 3986-统一资源标识符 这是现行标准(STD66)。对urllib.parse模块的任何更改都应符合此要求 这将是预期的产出: >>> urllib.parse.urlencode({'site':'Stack Overflow','Coder':'Jeff Atwood'}) 'Coder=Jeff%20Atwood

Python有一个很棒的函数,它通过RFC1738(加上编码)对dict进行编码:

我找不到使用RFC 3986(百分比编码)的替代品,即使精细手册:

RFC 3986-统一资源标识符
这是现行标准(STD66)。对urllib.parse模块的任何更改都应符合此要求

这将是预期的产出:

>>> urllib.parse.urlencode({'site':'Stack Overflow','Coder':'Jeff Atwood'})
'Coder=Jeff%20Atwood&site=Stack%20Overflow'

当然,我可以自己动手,但我发现很奇怪,我没有发现内置这样的Python函数是否有我找不到的Python函数?

似乎没有内置这样的函数,但有一个bug请求它,它甚至附带了一个补丁:

对于字符串,您可以使用以下方法:

def percent_encoding(string):
    result = ''
    accepted = [c for c in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~'.encode('utf-8')]
    for char in string.encode('utf-8'):
        result += chr(char) if char in accepted else '%{}'.format(hex(char)[2:]).upper()
    return result

>>> percent_encoding('http://www.google.com')
'http%3A%2F%2Fwww.google.com'

>>> percent_encoding('ñapa')
'%C3%B1apa'
现在,对于字典,您需要对值进行编码,因此您只需要一个函数将字典转换为url键/值对,只对其值进行编码

def percent_urlencode(dictionary):
    return '&'.join(["{}={}".format(k, percent_encoding(str(v))) for k, v in dictionary.items()])

>>> percent_urlencode({'token': '$%&/', 'username': 'me'})
'username=me&token=%24%25%26%2F'

>>> percent_urlencode({'site':'Stack Overflow','Coder':'Jeff Atwood'})
'site=Stack%20Overflow&Coder=Jeff%20Atwood'

我想你知道吗?我意识到这不是你想要的(不需要口述),但如果你需要自己做一部分,这是一个开始。@JohnZwinck:对,这将是“我自己滚”的重要组成部分。
def percent_urlencode(dictionary):
    return '&'.join(["{}={}".format(k, percent_encoding(str(v))) for k, v in dictionary.items()])

>>> percent_urlencode({'token': '$%&/', 'username': 'me'})
'username=me&token=%24%25%26%2F'

>>> percent_urlencode({'site':'Stack Overflow','Coder':'Jeff Atwood'})
'site=Stack%20Overflow&Coder=Jeff%20Atwood'