delphi版的URLDecode和URLEncode
php自带了URLDecode和urldecode函数,可以用来对&=等一些出现在url或者get/post内容中的控制字符进行转义。
delphi没有自带此类函数,必须自己写。
function URLDecode(const S: string): string;
var
Idx: Integer; // loops thru chars in string
Hex: string; // string of hex characters
Code: Integer; // hex character code (-1 on error)
begin
// Intialise result and string index
Result := ”;
Idx := 1;
// Loop thru string decoding each character
while Idx <= Length(S) do
begin
case S[Idx] of
‘%’:
begin
// % should be followed by two hex digits - exception otherwise
if Idx <= Length(S) - 2 then
begin
// there are sufficient digits - try to decode hex digits
Hex := S[Idx+1] + S[Idx+2];
Code := SysUtils.StrToIntDef(’$’ + Hex, -1);
Inc(Idx, 2);
end
else
// insufficient digits - error
Code := -1;
// check for error and raise exception if found
if Code = -1 then
raise SysUtils.EConvertError.Create(
‘Invalid hex digit in URL’
);
// decoded OK - add character to result
Result := Result + Chr(Code);
end;
‘+’:
// + is decoded as a space
Result := Result + ‘ ‘
else
// All other characters pass thru unchanged
Result := Result + S[Idx];
end;
Inc(Idx);
end;
end;
function URLEncode(const S: string; const InQueryString: Boolean): string;
var
Idx: Integer; // loops thru characters in string
begin
Result := ”;
for Idx := 1 to Length(S) do
begin
case S[Idx] of
‘A’..’Z', ‘a’..’z', ‘0′..’9′, ‘-’, ‘_’, ‘.’:
Result := Result + S[Idx];
‘ ‘:
if InQueryString then
Result := Result + ‘+’
else
Result := Result + ‘%20′;
else
Result := Result + ‘%’ + SysUtils.IntToHex(Ord(S[Idx]), 2);
end;
end;
end;