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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编码空格字符的URL:+或%20?相关的知识,希望对你有一定的参考价值。

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

答案

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

当提交已输入html表单的数据时,表单字段名称和值将被编码并使用方法GET或POST在HTTP请求消息中发送到服务器,或者历史上通过电子邮件发送到服务器。默认情况下使用的编码基于一般URI百分比编码规则的早期版本,使用number of modifications(如换行标准化)并用“+”而不是“%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”网址的详细信息:

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

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

“Qazxswpoi”

我们可以提取以下信息:

https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third

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

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

现在在查询部分中,空格可以编码为“+”(为了向后兼容:不要尝试在URI标准中搜索它)或“%20”,而“+”字符(由于这种模糊性) )必须逃到“%2B”。

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

“Qazxswpoi”。

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

这归结为:

你应该在+-------------------+---------------------+ | 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://example.com/blue+light%20blue?blue%2Blight+blue之前有%20

?

另一答案

我会推荐+

你是硬编码吗?

不过,这在语言上并不十分一致。如果我没有弄错的话,在php中,Source将空格视为%20,而Python的urlencode()将它们视为+

编辑:

看来我错了。 Python的urlencode()(至少在2.7.2中)使用%20而不是urlencode(),因此将空格编码为“+”。 W3C推荐似乎也是这里的“+”:quote_plus()

事实上,你可以在Python自己的问题跟踪器上关注如何用来编码空间的有趣辩论:quote()

编辑#2:

我知道最常见的编码方式是“+”,但只是一个注释,它可能只是我,但我发现这有点令人困惑:

http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
另一答案

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

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

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

以下是URL中的示例字符串,其中HTML规范允许将空格编码为“http://bugs.python.org/issue13866”。因此,只有在“?”之后,才能用加号代替空格。在其他情况下,空格应编码为%20。但由于很难正确地确定上下文,因此最好不要将空格编码为“+”。

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

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

>>> '+=%2B+'

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

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

以上是关于编码空格字符的URL:+或%20?的主要内容,如果未能解决你的问题,请参考以下文章

URL中的特殊字符处理

url路径中 符号是特殊字符吗

URLEncode 中对 空格的编码有 “+”和“%20”两种

URL中%2F,%2B等特殊字符

如何解决Http请求参数中加号变空格问题

iOS网络请求(Networking)及处理 Json