协慌网

登录 贡献 社区

编码空格字符的 URL:+ 或%20?

URL 中的空格何时编码为+ ,何时编码为%20

答案

维基百科(重点和链接已添加):

提交已输入 HTML 表单的数据后,将使用 GET 或 POST 方法或历史上通过电子邮件以 HTTP 请求消息的形式对表单字段名称和值进行编码并发送到服务器。默认情况下,使用的编码基于 URI 常规百分比编码规则的早期版本,并进行了许多修改,例如换行符标准化以及将空格替换为 “+” 而不是 “%20”。以这种方式编码的数据的 MIME 类型是 application / x-www-form-urlencoded,并且当前已在 HTML 和 XForms 规范中定义(仍然以非常过时的方式)。

因此,实际百分比编码使用%20而 URL 中的表单数据采用的形式是+ 。因此,您最有可能只在查询字符串后的 URL 中+ ?

造成这种混乱的原因是,到目前为止,URL 仍然是 “中断” 的。

以 “ http://www.google.com ” 为例。这是一个 URL。 URL 是统一资源定位符,实际上是指向网页的指针(在大多数情况下)。自 1994 年发布第一个规范以来,URL 实际上具有定义明确的结构。

我们可以提取有关 “ http://www.google.com ” URL 的详细信息:

+---------------+-------------------+
|      Part     |      Data         |
+---------------+-------------------+
|  Scheme       | http              |
|  Host         | www.google.com    |
+---------------+-------------------+

如果我们看一个更复杂的 URL,例如:

https:// bob:[email protected]:8080 / file; p = 1?q = 2#third

我们可以提取以下信息:

+-------------------+---------------------+
|        Part       |       Data          |
+-------------------+---------------------+
|  Scheme           | https               |
|  User             | bob                 |
|  Password         | bobby               |
|  Host             | www.lunatech.com    |
|  Port             | 8080                |
|  Path             | /file;p=1           |
|  Path parameter   | p=1                 |
|  Query            | q=2                 |
|  Fragment         | third               |
+-------------------+---------------------+

https://bob:[email protected]:8080/file;p=1?q=2#third
\___/   \_/ \___/ \______________/ \__/\_______/ \_/ \___/
  |      |    |          |          |      | \_/  |    |
Scheme User Password    Host       Port  Path |   | Fragment
        \_____________________________/       | Query
                       |               Path parameter
                   Authority

每个部分的保留字符都不同。

对于 HTTP URL,路径片段部分中的空格必须编码为 “%20”(不是绝对不是 “+”),而路径片段部分中的 “+” 字符可以保留为未编码。

现在在查询部分中,空格可以编码为 “+”(为了向后兼容:请勿尝试在 URI 标准中搜索)或 “%20”,而将 “+” 字符编码(由于这种歧义) )必须转义为 “%2B”。

这意味着必须在路径和查询部分中对 “blue + light blue” 字符串进行不同的编码:

http://example.com/blue+light%20blue?blue%2Blight+blue ”。

从那里可以推断出,如果没有句法意识的 URL 结构,就不可能对完全构造的 URL 进行编码。

归结为:

您应该在%之前加上%20 ?+之后。

来源

我建议%20

您是否在对它们进行硬编码?

但是,这在不同语言之间不是很一致。如果我没记错的话,在 PHP 中urlencode()将空格视为+而 Python 的urlencode()%20

编辑:

看来我弄错了。 Python 的urlencode() (至少在 2.7.2 中)使用quote_plus()而不是quote() ,因此将空格编码为 “+”。似乎 W3C 建议也是此处的 “+”: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

实际上,您可以关注关于 Python 自己的问题跟踪器的有趣辩论,该问题涉及使用什么对空间进行编码: http ://bugs.python.org/issue13866。

编辑#2:

我了解编码 “” 的最常见方式是将其编码为 “ +”,但请注意,可能只是我一个人,但是我发现这有点令人困惑:

import urllib
print(urllib.urlencode({' ' : '+ '})

>>> '+=%2B+'