为什么urllib.parse.urlencode没有将'_'更改为%5F?

时间:2016-05-30 14:48:37

标签: python-3.x post urllib urlencode

我正在为我正在尝试制作脚本的游戏写POST请求。对于这篇文章,我使用的是公共req = urllib.request.Request(url=url, data=params, headers=headers)首先,我有一个请求所需数据的字典,我必须用params = urllib.parse.urlencode(OrderedDict[])

编码

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

根据RFC 1738

  

不安全:

     

由于多种原因,角色可能不安全。空间      角色是不安全的,因为重要的空间可能会消失      当转录URL时,可能会引入无关紧要的空格      排版或受到文字处理程序的处理。      字符<>不安全,因为它们被用作      自由文本中的URL分隔符;引号(")用于      在某些系统中划分URL。角色#不安全且应该      总是被编码,因为它在万维网和其他网络中使用      用于从可能的片段/锚标识符界定URL的系统      跟着它。字符%不安全,因为它用于      其他角色的编码。其他角色不安全因为      已知网关和其他传输代理有时会修改      这样的人物。这些字符为{}|\^~,      []`

     

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

因此_未被%5F取代的原因与a未被%61取代的原因相同:它不是必需的。网络服务器不管(或不应该)关心。

如果您尝试使用的网络服务器确实关心(但请先检查是否属于这种情况),您必须做一些手动工作,因为urllib引用{{ 3}} _

  

urllib.parse.quote(字符串,安全=&#39; /&#39;,编码=无,错误=无)

     

使用%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)