Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

URL декодирование строки

01.01.2007
{ **** UBPFD *********** by kladovka.net.ru ****
>> URL декодирование строки
 
Функция выполняет URL декодирование строки, заменяя все
подстроки вида '%HH', где 'HH' - шестнадцатеричные
цифры, на соответствующие символы.
 
Зависимости: Windows
Автор:       Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург
Copyright:   Dimka Maslov
Дата:        27 мая 2002 г.
********************************************** }
 
function UrlDecode(Str: string): string;
 
function HexToChar(W: word): Char;
asm
   cmp ah
, 030h
   jl @@error
   cmp ah
, 039h
   jg @@10
   
sub ah, 30h
   jmp @@30
@@10
:
   cmp ah
, 041h
   jl @@error
   cmp ah
, 046h
   jg @@20
   
sub ah, 041h
   add ah
, 00Ah
   jmp @@30
@@20
:
   cmp ah
, 061h
   jl @@error
   cmp al
, 066h
   jg @@error
   
sub ah, 061h
   add ah
, 00Ah
@@30
:
   cmp al
, 030h
   jl @@error
   cmp al
, 039h
   jg @@40
   
sub al, 030h
   jmp @@60
@@40
:
   cmp al
, 041h
   jl @@error
   cmp al
, 046h
   jg @@50
   
sub al, 041h
   add al
, 00Ah
   jmp @@60
@@50
:
   cmp al
, 061h
   jl @@error
   cmp al
, 066h
   jg @@error
   
sub al, 061h
   add al
, 00Ah
@@60
:
   shl al
, 4
   
or al, ah
   ret
@@error
:
   xor al
, al
end;
 
function GetCh(P: PChar; var Ch: Char): Char;
begin
 
Ch:=P^;
 
Result:=Ch;
end;
 
var
 P
: PChar;
 
Ch: Char;
begin
 
Result:='';
 P
:=@Str[1];
 
while GetCh(P, Ch) <> #0 do begin
 
case Ch of
   
'+': Result:=Result+' ';
   
'%': begin
   
Inc(P);
   
Result:=Result+HexToChar(PWord(P)^);
   
Inc(P);
   
end;
   
else Result:=Result+Ch;
 
end;
 
Inc(P);
 
end;
end;