Answers:
+
指的是空间仅在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更安全)。
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 。
foo bar
到foo+bar
?
encodeURIComponent(s).replace(/%20/g, '+')
如果您确实需要,您可以自然地做+
http://www.example.com/some/path/to/resource?param1=value1
问号前的部分必须使用%编码(因此%20
用于空格),问号后的部分可以使用%20
或+
空格。如果您需要实际+
的问号后使用%2B
。
decodeURIComponent
请勿解码。
+
是保留字符,它将被浏览器保留。
+
默认使用({ foo: 'bar bar'}.to_query
=> foo=bar+bar
)解码空格
因此,这里的答案有点不完整。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文档以外的任何内容,那么肯定是这种情况。
%20
(<a href="?q=a b">
),但是在发送表单时,它会使用+
符号。您可以通过显式使用+
符号(<a href="?q=a+b">
)或通过使用发送表单来覆盖它XMLHTTPRequest
。
最好始终将空格编码为%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 / "-" / "." / "_" / "~"
有什么区别:请参阅其他答案。
什么时候使用+
代替%20
?使用+
如果由于某种原因,你想的网址查询字符串(?.....
)或哈希代码(#....
)更具可读性。示例:您实际上可以阅读以下内容:
https://www.google.se/#q=google+doesn%27t+encode+:+and+uses+%2B+而不是%2B
+ of + spaces
(= +)
但是以下内容很难阅读:(至少对我来说)
我认为+
不可能破坏任何东西,因为Google会使用+
(请参阅上面的第一个链接),并且他们可能已经考虑过这一点。我+
之所以要使用自己,是因为可读性强+ Google认为还可以。