为什么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)
谢谢!我用你说的和我读过我的代码。 。 。事实证明,我使用'int(time.time())'而不是'int(time())'作为时间戳。 。 。 > XaNaX