URL编码空格字符:+或%20?
何时URL中的空格编码为+
,何时编码为%20
?
来自维基百科 (重点和链接补充):
当提交已inputHTML表单的数据时,表单字段名称和值将被编码,并通过使用方法GET或POST的HTTP请求消息发送到服务器,或者历史地通过电子邮件发送到服务器。 默认使用的编码基于通用URI百分比编码规则的早期版本,并进行了一些修改 ,如换行符标准化,用“+”而不是“%20”replace空格。 以这种方式编码的MIMEtypes的数据是application / x-www-form-urlencoded,目前在HTML和XForms规范中定义(仍然是过时的方式)。
因此, 真正的百分比编码使用%20
而URL中的表单数据是使用+
的修改forms。 所以你最有可能只在查询string中的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: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,path片段部分中的空格必须编码为“%20”(不是,绝对不是“+”),而path片段部分中的“+”字符可以不进行编码。
现在在查询部分,空格可能被编码为“+”(为了向后兼容性:不要尝试在URI标准中search它)或“%20”而“+”字符(由于这种模糊性)必须被转移到“%2B”。
这意味着“蓝色+浅蓝色”string必须在path和查询部分中进行不同的编码:
“ http://example.com/blue+light%20blue?blue%2Blight+blue ”。
从那里你可以推断出,如果没有URL结构的语法意识,编码完全构造的URL是不可能的。
这可以归结为:
你应该在%20
之前?
和+
之后。
资源
我会推荐%20
。
你是用硬编码吗?
虽然这在语言上不是很一致。 如果我没有弄错,在PHP中, urlencode()
将空格视为+
而Python的urlencode()
视为%20
。
编辑:
看来我错了。 Python的urlencode()
(至less在2.7.2中)使用quote_plus()
而不是quote()
,因此将空格编码为“+”。 W3C的build议似乎也是按照这里的“+”: 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+'
在“应用程序/ x-www-form-urlencoded”内容types键值对查询部分的URL中,空格只能被编码为“+”。 这是可能的,不是必须的。 在其余的url中,它被编码为%20。
在我看来,即使在URL的查询部分,总是将空格编码为%20,而不是“+”,因为它是HTML规范(RFC-1866),指定空格字符应编码为“ +“在”application / x-www-form-urlencoded“内容types的键值对中。 (见第8.2.1节第1项)。这种对表单数据进行编码的方式也在稍后的HTML规范中给出,例如,在HTML 4.01规范中寻找关于application / x-www-form-urlencoded的相关段落,等等。
下面是一个URL规范允许编码空间为加号的示例string:“ http://example.com/over/there?name=foo+bar ”。 所以,只有在“?”之后,根据HTML规范,空格才能被replace。 在其他情况下,空格应该被编码为%20。 但是由于很难正确地确定上下文,因此最好不要将空格编码为“+”。
我build议百分比编码除RFC-3986,第2.3节中定义的“unreserved”之外的所有字符
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
实现取决于您select的编程语言。
如果您的url包含国家/地区字符,请先将它们编码为UTF-8,然后对结果进行百分比编码。