url和加号

我知道一个URL的查询string中的+代表一个空格。 这也是查询string区域之外的情况吗? 也就是说,做下面的url:

 http://a.com/a+b/c 

实际上代表:

 http://a.com/ab/c 

(因此需要编码,如果它应该实际上是+ ),或者它实际上是否代表a+b/c

  • 预计URL的path部分中的编码百分比将被解码,但是
  • 期望path组件中的任何+字符被逐字处理。

明确地说: +只是查询组件中的一个特殊字符。

您可以在W3School上find相应的URL编码字符列表。

  • +变成%2B
  • 空间变成%20

空格字符只能在一个上下文中编码为“+”:application / x-www-form-urlencoded键值对。

RFC-1866(HTML 2.0规范)第8.2.1段。 第1项说:“表单字段名称和值被转义:空格字符被replace为'+',然后保留字符被转义”)。

以下是RFC-1866允许将空格编码为加号的URL中的这样一个string的示例:“ http://example.com/over/there?name=foo+bar ”。 所以,只有在“?”之后,空格可以被replace(在其他情况下,空格应该被编码为%20)。 这种编码forms数据的方法也在稍后的HTML规范中给出,例如,在HTML 4.01规范中寻找关于application / x-www-form-urlencoded的相关段落等等。

但是,由于很难始终正确地确定上下文,因此最好不要将空格编码为“+”。 除了在RFC-3986,第2.3节中定义的“unreserved”之外,最好对所有字符进行百分比编码。 这里是一个代码示例,说明应该编码的内容。 它是用Delphi(pascal)编程语言给出的,但是很容易理解它如何适用于任何程序员,而不pipe所拥有的语言如何:

 (* percent-encode all unreserved characters as defined in RFC-3986, p.2.3 *) function UrlEncodeRfcA(const S: AnsiString): AnsiString; const HexCharArrA: array [0..15] of AnsiChar = '0123456789ABCDEF'; var I: Integer; c: AnsiChar; begin // percent-encoding, see RFC-3986, p. 2.1 Result := S; for I := Length(S) downto 1 do begin c := S[I]; case c of 'A' .. 'Z', 'a' .. 'z', // alpha '0' .. '9', // digit '-', '.', '_', '~':; // rest of unreserved characters as defined in the RFC-3986, p.2.3 else begin Result[I] := '%'; Insert('00', Result, I + 1); Result[I + 1] := HexCharArrA[(Byte(C) shr 4) and $F)]; Result[I + 2] := HexCharArrA[Byte(C) and $F]; end; end; end; end; function UrlEncodeRfcW(const S: UnicodeString): AnsiString; begin Result := UrlEncodeRfcA(Utf8Encode(S)); end; 

使用encodeURIComponent函数来修复url,它适用于Browser和node.js

 res.redirect("/signin?email="+encodeURIComponent("aaa+bbb-ccc@example.com")); > encodeURIComponent("http://a.com/a+b/c") 'http%3A%2F%2Fa.com%2Fa%2Bb%2Fc' 

你总是要编码的url。

以下是Ruby如何编码您的url:

 irb(main):008:0> CGI.escape "a.com/a+b" => "a.com%2Fa%2Bb" 

试试下面:

 <script type="text/javascript"> function resetPassword() { url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char); } function fixEscape(str) { return escape(str).replace( "+", "%2B" ); } </script>