为什么urllib.parse.urlencode不会将“_”更改为%5F?

问题描述:

我正在编写游戏的POST请求我正在尝试制作脚本。对于这篇文章,我使用的是共同的req = urllib.request.Request(url=url, data=params, headers=headers)首先,我有一个需要的数据字典,我必须用params = urllib.parse.urlencode(OrderedDict[])为什么urllib.parse.urlencode不会将“_”更改为%5F?

编码它然而,这给了我一个字符串,但不是正确的!它会给我:

&x=_1&y_=2&_z_=3 

但是,游戏编码事情的方式,它应该是:

&x=%5F1&y%5F=2&%5Fz%5F=3 

所以我的不编码下划线为“%5F”。我该如何解决?如果可以,我有游戏使用的参数(在url中,预编码),我可以在请求的数据字段中使用它吗?

下划线不需要编码,因为它们是URL中的有效字符。

作为每RFC 1738

不安全:

字符可以是不安全的多种原因。空格 字符是不安全的,因为重要的空格可能会消失,并且当转录URL或 排版或受到文字处理程序的处理时可能会引入不重要的空格。 字符<>是不安全的,因为它们被用作围绕*文本的URL的 分隔符;引号(")用于在某些系统中为 分隔URL。字符#是不安全的,并且应始终编码 ,因为它在万维网和其他 系统中用于从可能遵循它的片段/锚点标识符中划分URL。字符%是不安全的,因为它用于 其他字符的编码。其他字符是不安全的,因为 网关和其他传输代理有时会修改 这样的字符。这些字符是{}|\^~[]`

所有不安全的字符必须始终在URL中进行编码。

所以_%5F取代的原因是a不被%61替代的相同的理由:它只是没有必要的。 Web服务器不会(或不应该)关心这两种方式。

如果你想使用Web服务器做护理(但请先检查,如果是这样的话),你就必须做一些体力劳动,如urllibs报价does not support quoting_

的urllib.parse。quote(string,safe ='/',encoding = None,errors = None)

使用%xx转义替换字符串中的特殊字符。字母,数字和字符_.-从不引用。

您可以用自己的功能包装quote()并将其传递给urlencode()。像这样(完全未经测试):

def extra_quote(*args, **kwargs): 
    quoted = urllib.pars.quote(*args, **kwargs) 
    return str.replace(quoted, '_', '%5F') 

urllib.parse.urlencode(query, quote_via=extraquote) 
+0

谢谢!我用你说的和我读过我的代码。 。 。事实证明,我使用'int(time.time())'而不是'int(time())'作为时间戳。 。 。 > XaNaX