我知道URL的查询字符串中的+
表示空格。这也是查询字符串区域之外的情况吗?也就是说,请执行以下URL:
http://a.com/a+b/c
实际上代表:
http://a.com/a b/c
(因此需要进行编码,如果它实际上应该是+
),或者它实际上是否实际代表a+b/c
?
答案 0 :(得分:212)
您可以在W3Schools上找到相应网址编码字符的精彩列表。
+
变为%2B
%20
答案 1 :(得分:162)
+
字符都应按字面处理。 要明确:+
只是查询组件中的特殊字符。
答案 2 :(得分:19)
空格字符只能编码为" +"在一个上下文中: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的相关段落,等等。
但是,由于很难始终正确地确定上下文,因此从不将空格编码为" +"是最佳做法。对所有字符进行百分比编码会更好,除非"未保留"在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;
答案 3 :(得分:1)
使用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'
答案 4 :(得分:-3)
尝试以下:
<script type="text/javascript">
function resetPassword() {
url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char);
}
function fixEscape(str)
{
return escape(str).replace( "+", "%2B" );
}
</script>
答案 5 :(得分:-5)
您应始终对网址进行编码。
以下是Ruby对您的网址进行编码的方式:
irb(main):008:0> CGI.escape "a.com/a+b"
=> "a.com%2Fa%2Bb"