网址中的空格何时编码为+
,何时编码为%20
?
答案 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
和?
之前+
。
答案 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,然后对结果进行百分比编码。