function UrlDecode(const AStr: AnsiString): AnsiString; var Sp, Rp, Cp: PAnsiChar; s: AnsiString; begin SetLength(Result, Length(AStr)); Sp := PAnsiChar(AStr); Rp := PAnsiChar(Result); Cp := Sp; while Sp^ <> #0 do begin case Sp^ of '+': Rp^ := ' '; '%': begin // Look for an escaped % (%%) or %<hex> encoded character Inc(Sp); if Sp^ = '%' then Rp^ := '%' else begin Cp := Sp; Inc(Sp); if (Cp^ <> #0) and (Sp^ <> #0) then begin s := AnsiChar('$') + Cp^ + Sp^; Rp^ := AnsiChar(StrToInt(string(s))); end; end; end; else Rp^ := Sp^; end; Inc(Rp); Inc(Sp) end; SetLength(Result, Rp - PAnsiChar(Result)); end; function UrlEncode(const AStr: AnsiString): AnsiString; const NoConversion = ['A' .. 'Z', 'a' .. 'z', '*', '@', '.', '_', '-', '0' .. '9', '$', '!', '''', '(', ')']; var Sp, Rp: PAnsiChar; begin SetLength(Result, Length(AStr) * 3); Sp := PAnsiChar(AStr); Rp := PAnsiChar(Result); while Sp^ <> #0 do begin if Sp^ in NoConversion then Rp^ := Sp^ else if Sp^ = ' ' then Rp^ := '+' else begin FormatBuf(Rp^, 3, AnsiString('%%%.2x'), 6, [Ord(Sp^)]); Inc(Rp, 2); end; Inc(Rp); Inc(Sp); end; SetLength(Result, Rp - PAnsiChar(Result)); end;