URL方案/主机/路径中的“+”是否代表空格?

我知道URL的查询字符串中的+代表一个空格。在查询字符串区域之外也是这样吗?也就是说,下面的URL:

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

实际上代表:

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

(因此,如果它实际上应该是+,则需要进行编码),还是它实际上实际上表示a+b/c?

243099 次浏览

你应该对url进行编码。

下面是Ruby如何编码你的URL:

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

你可以在W3Schools上找到一个很好的对应URL编码字符列表。

  • +变成%2B
  • space变成%20
  • URL的路径部分中的百分比编码预计将被解码,但是
  • 路径组件中的任何+字符都将被逐字处理。

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

https://www.rfc-editor.org/rfc/rfc3986

试试下面:

<script type="text/javascript">


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

使用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'

空格字符只能被编码为"+"application/x-www-form-urlencoded键值对。

RFC-1866 (HTML 2.0规范)第8.2.1段第1段说:&;表单字段名和值被转义:空格字符被&;+&;取代,然后保留字符被转义&;)。

下面是URL中这样一个字符串的例子,RFC-1866允许编码空格为加号:"http://example.com/over/there?name=foo+bar"因此,只有在“;?”之后,空格才能被加号取代(在其他情况下,空格应该被编码为“;%20"”)。这种编码表单数据的方式也在后面的HTML规范中给出,例如,在HTML 4.01规范中查找有关application/x-www-form-urlencoded的相关段落,等等。

但是,因为很难总是正确地确定上下文,所以最好不要将空格编码为"+"。最好对除“unreserved”之外的所有字符进行百分比编码。定义见RFC-3986,第2.3页。下面是一个代码示例,说明了应该对什么进行编码。它是用Delphi (pascal)编程语言给出的,但对于任何程序员来说,无论拥有哪种语言,都很容易理解它是如何工作的:

(* 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;