Fra*_*y I 219 url encoding query-string
我知道+URL的查询字符串中的a表示空格.这也是查询字符串区域之外的情况吗?也就是说,请执行以下URL:
http://a.com/a+b/c
Run Code Online (Sandbox Code Playgroud)
实际上代表:
http://a.com/a b/c
Run Code Online (Sandbox Code Playgroud)
(因此,如果它实际上应该是a +,则需要进行编码),还是实际上实际上代表了a+b/c?
Sto*_*bor 166
+路径组件中的任何字符都应按字面处理.显式:+只是查询组件中的特殊字符.
Max*_*tin 21
空格字符只能在一个上下文中编码为"+":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,p.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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
225212 次 |
| 最近记录: |