编码空格字符的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?的主要内容,如果未能解决你的问题,请参考以下文章