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

时间:2009-10-27 23:23:24

标签: url url-encoding

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

4 个答案:

答案 0 :(得分:379)

来自Wikipedia(重点和链接已添加):

  

当提交已输入HTML表单的数据时,表单字段名称和值将被编码并使用方法GET或POST在HTTP请求消息中发送到服务器,或者历史上通过电子邮件发送到服务器。 默认情况下使用的编码基于一般URI百分比编码规则的早期版本,其中number of modifications如换行标准化,并用“+”代替“%20”替换空格。 / strong>以这种方式编码的数据的MIME类型是application / x-www-form-urlencoded,它目前在HTML和XForms规范中定义(仍然是一种非常过时的方式)。

因此,真实百分比编码使用%20,而网址中的表单数据采用+的修改形式。因此,您最有可能仅在+之后的查询字符串中的网址中看到?

答案 1 :(得分:249)

这种混淆是因为到目前为止,网址仍然“破损”。

  

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

     

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

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

如果我们查看更复杂的网址,例如:

     

https://bob:bobby@www.lunatech.com: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:bobby@www.lunatech.com:8080/file;p=1?q=2#third
\___/   \_/ \___/ \______________/ \__/\_______/ \_/ \___/
  |      |    |          |          |      | \_/  |    |
Scheme User Password    Host       Port  Path |   | Fragment
        \_____________________________/       | Query
                       |               Path parameter
                   Authority
  

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

     

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

现在在查询部分中,空格可以编码为“+”(为了向后兼容:不要尝试在URI标准中搜索它)或“%20”,而“+”字符(作为结果这种歧义)必须被转移到“%2B”。

     

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

     

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

     

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

归结为:

您应该在%20?之前+

Source

答案 2 :(得分:21)

我建议%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+'

答案 3 :(得分:11)

空格只能在URL的“application / x-www-form-urlencoded”内容类型键值对查询部分中编码为“+”。这是一个MAY,而不是必须。在其余的URL中,它被编码为%20。

在我看来,总是将空格编码为%20,而不是“+”,即使在URL的查询部分也是如此,因为HTML规范(RFC-1866)指定了空格字符应该是在“application / x-www-form-urlencoded”内容类型键值对中编码为“+”。 (见第8.2.1段,第1段。)

这种编码表单数据的方式也在后面的HTML规范中给出。例如,在HTML 4.01规范中查找有关application / x-www-form-urlencoded的相关段落,等等。

以下是URL中的示例字符串,其中HTML规范允许将空格编码为“http://example.com/over/there?name=foo+bar”。因此,根据HTML规范,只有在“?”之后,空格才能被加号替换。在其他情况下,空格应编码为%20。但由于很难正确地确定上下文,因此最好不要将空格编码为“+”。

我建议对所有字符进行百分比编码,但RFC-3986中定义的“无保留”除外,第2.3页

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"

实现取决于您选择的编程语言。

如果您的网址包含国家字符,请先将其编码为UTF-8,然后对结果进行百分比编码。