何时将空格编码为加号(+)或%20?


Answers:


481

+指的是空间application/x-www-form-urlencoded内容,如网址的查询部分:

http://www.example.com/path/foo+bar/path?query+name=query+value

在此URL中,参数名称query name带有空格,值query value带有空格,但是路径中的文件夹名称实际上是foo+bar而不是 foo bar

%20是在这两种情况下对空间进行编码的有效方法。因此,如果您需要对字符串进行URL编码以包含在URL的一部分中,则始终可以安全地用%20和替换空格%2B。这就是例如。encodeURIComponent()在JavaScript中执行。不幸的是,这不是urlencode在PHP中所做的(rawurlencode更安全)。

另请参见 HTML 4.01规范application / x-www-form-urlencoded


5
真的让我感到困惑,我的问题是,浏览器何时执行第一种形式,何时执行第二种形式?
Muhammad Hewedy'4

11
浏览器将query+name=query+value使用形式从表单创建参数<input name="query name" value="query value">。它不会query%20name从表单创建,但是使用它是完全安全的,例如。如果您要自行提交表单提交XMLHttpRequest。如果您的URL中带有空格(如)<a href="http://www.example.com/foo bar/">,则浏览器会将其编码%20为您解决错误,但最好不要依赖该URL 。
bobince 2010年

6
什么功能上的JavaScript通过foo barfoo+bar
西西尔(Sisir)2012年

21
@Sisir:没有一个可以执行URL形式编码的JS函数。encodeURIComponent(s).replace(/%20/g, '+')如果您确实需要,您可以自然地做+
bobince 2012年

2
那是一个形式混淆的东西的非常非常令人困惑的例子。它与URL无关。
Dave Van den Eynde 2014年

54

http://www.example.com/some/path/to/resource?param1=value1

问号前的部分必须使用%编码(因此%20用于空格),问号后的部分可以使用%20+空格。如果您需要实际+的问号后使用%2B


6
@DaveVandenEynde为什么不呢?
cerberos 2014年

10
因为错了 它是旧的application / x-www-form-urlencoded媒体类型的一部分,不适用于URL。另外,decodeURIComponent请勿解码。
Dave Van den Eynde

3
是的,它可能是从RFC 1630复制而来,从来没有真正成为一个标准。tools.ietf.org/html/rfc3986是标准(针对IPv6或类似内容再次更新)。当然,浏览器仍然“支持”它,但这意味着什么?读取查询字符串并对其进行解码的是服务器或客户端代码,而不是浏览器。浏览器只是简单地来回传递它,并且由于+保留字符,它将被浏览器保留。
Dave Van den Eynde 2014年

18
Google在搜索网址中使用空格(+ 。)(google.com/#q=perl+equivalent+to+php+urlencode+spaces+as+%2B)。
贾斯汀

2
仅供参考:Rails还+默认使用({ foo: 'bar bar'}.to_query=> foo=bar+bar)解码空格
wrtsprt

46

因此,这里的答案有点不完整。RFC3986中明确定义了使用'%20'来编码URL中的空格,该文件定义了URI的构建方式。在本规范中没有提及使用'+'来编码空格-如果仅按照本规范进行操作,则必须将空格编码为'%20'。

提到使用“ +”来编码空格来自HTML规范的各种形式-特别是在描述内容类型“ application / x-www-form-urlencoded”的部分中。这用于过帐表单数据。

现在,HTML 2.0规范(RFC1866)在8.2.2节中明确表示,GET请求的URL字符串的“查询”部分应编码为“ application / x-www-form-urlencoded”。从理论上讲,这表明在查询字符串的URL中使用“ +”是合法的(在“?”之后)。

但是...真的吗?请记住,HTML本身是内容规范,带有查询字符串的URL可以与HTML以外的其他内容一起使用。此外,尽管更高版本的HTML规范继续在“ application / x-www-form-urlencoded”内容中将“ +”定义为合法内容,但它们完全省略了将GET请求查询字符串定义为该类型的部分。实际上,在HTML 2.0规范之后的任何内容中都没有提及查询字符串编码。

这给我们留下了一个问题-它有效吗?当然,有很多遗留代码支持查询字符串中的“ +”,并且还有很多生成它的代码。因此,如果您使用“ +”,则赔率很不错。(实际上,我最近对此进行了所有研究,因为我发现一个主要站点未能接受GET查询中的'%20'作为空格。它们实际上无法解码任何百分比编码的字符。因此,您可以使用该服务使用也可能是相关的。)

但是,仅从规范的阅读,而没有将HTML 2.0规范的语言延续到更高版本中,URL完全被RFC3986覆盖,这意味着应将空格转换为'%20'。如果您要请求除HTML文档以外的任何内容,那么肯定是这种情况。


为了增加您的答案,Chrome默认将网址中的空格编码为%20<a href="?q=a b">),但是在发送表单时,它会使用+符号。您可以通过显式使用+符号(<a href="?q=a+b">)或通过使用发送表单来覆盖它XMLHTTPRequest
x-yuri

确实很难理解添加URLSearchParams developers.google.com/web/updates/2016/01/urlsearchparams的目的,该目的以某种传统方式起作用(将SPACE序列化为“ +”)。IE11甚​​至不支持它!
苯丙胺

9

最好始终将空格编码为%20,而不是“ +”。

这是RFC-1866(HTML 2.0规范),它指定在“ application / x-www-form-urlencoded”内容类型键值对中,空格字符应编码为“ +”。(请参见第8.2.1节第1项。)。稍后的HTML规范中也提供了对表单数据进行编码的方式,请查找有关application / x-www-form-urlencoded的相关段落。

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

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

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

1
在.Net Framework中,UrlEncode在QueryString中使用'+',但在现代.Net Core%20中使用
Michael Freidgeim

@ MiFreidgeimSO-stopbeingevil感谢您让我们知道。似乎现代的.Net Core决定更加一致和兼容。
Maxim Masiutin

2

有什么区别:请参阅其他答案。

什么时候使用+代替%20?使用+如果由于某种原因,你想的网址查询字符串(?.....)或哈希代码(#....)更具可读性。示例:您实际上可以阅读以下内容:

https://www.google.se/#q=google+doesn%27t+encode+:+and+uses+%2B+而不是%2B + of + spaces (= +)

但是以下内容很难阅读:(至少对我来说)

https://www.google.se/#q=google%20doesn%27t%20oops%20:%20%20this%20text%20%2B%20is%20different%20spaces

我认为+不可能破坏任何东西,因为Google会使用+(请参阅上面的第一个链接),并且他们可能已经考虑过这一点。我+之所以要使用自己,是因为可读性强+ Google认为还可以。


7
我说“可读性”是对“ +”的最佳辩护。“谷歌做到了”的说法是谬误的en.wikipedia.org/wiki/Argument_from_authority
FlipMcF

2
@FlipMcF来自权威维基百科的谬误论点页面是关于“当在其专业领域之外的某个主题上引用某个权威时,或者当引用的权威不是真正的专家时 ” —但是,我认为计算机,HTTP和URL编码是东西的专业谷歌的区域。
KajMagnus

3
@FlipMcF在这种情况下,引用Google的行为是在URL中使用“ +”的有效参数。并不是说google是权威机构,而是google可能是最大的互联网公司,而且如果它们以某种方式做某事,那么浏览器极有可能在一天之内决定停止支持这种做法。另外,谷歌浏览器是份额最高的浏览器之一,它们将支持谷歌想要的任何功能。总而言之,我想说,在可预见的将来,没有人会用“ +”代替“%20”。
jdferreira

我希望在其他地方继续提出这一论点,在这里有人呼吁拒绝承认对权威的呼吁。至少我们都可以就一件事达成共识:“ +”优于“%20”
FlipMcF

1
实际上,带有%20的URL更容易阅读,因为(桌面)浏览器将鼠标光标移到链接上时,会在窗口底部显示解码后的URL。加号保持不变。
马丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.