Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.28;
Скачать: CL | DM;

Вниз

Функции перекодирования безопасных URL   Найти похожие ветки 

 
Tack   (2006-04-29 22:48) [0]

Привет. Есть у кого-нибудь готовые функции для перекодирования небезопасных URL в безопасные и обратно, например:
some text -> some%20text ?

Самому писать ломает, т.к. надо изучать спецификацию W3C.
Заранее спасибо


 
DrPass ©   (2006-04-29 23:08) [1]

StringReplace


 
Anatoly Podgoretsky ©   (2006-04-29 23:16) [2]

Знаешь нам тоже лень.


 
Tack   (2006-04-29 23:50) [3]

Вот, нашел. Другим лентяям пригодится. Думаю, времени на поиск потрачено все же меньше, чем на разработку. :-\

*****************************************************
Автор:       Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург
Copyright:   Dimka Maslov
Дата:        27 мая 2002 г.
*****************************************************

function UrlEncode(Str: string): string;

 function CharToHex(Ch: Char): Integer;
 asm
   and eax, 0FFh
   mov ah, al
   shr al, 4
   and ah, 00fh
   cmp al, 00ah
   jl @@10
   sub al, 00ah
   add al, 041h
   jmp @@20
@@10:
   add al, 030h
@@20:
   cmp ah, 00ah
   jl @@30
   sub ah, 00ah
   add ah, 041h
   jmp @@40
@@30:
   add ah, 030h
@@40:
   shl eax, 8
   mov al, "%"
 end;

var
 i, Len: Integer;
 Ch: Char;
 N: Integer;
 P: PChar;
begin
 Result := "";
 Len := Length(Str);
 P := PChar(@N);
 for i := 1 to Len do
 begin
   Ch := Str[i];
   if Ch in ["0".."9", "A".."Z", "a".."z", "_"] then
     Result := Result + Ch
   else
   begin
     if Ch = " " then
       Result := Result + "+"
     else
     begin
       N := CharToHex(Ch);
       Result := Result + P;
     end;
   end;
 end;
end;

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;



 
Lamer@fools.ua ©   (2006-04-29 23:51) [4]

>Есть у кого-нибудь готовые функции для перекодирования небезопасных URL в безопасные и обратно

Есть.
(uses IdGlobal)
function URLDecode(psSrc: string): string;
function URLEncode(const psSrc: string): string;


 
Tack   (2006-04-29 23:53) [5]

О! спасибо Lamer@fools.ua ! Это еще лучше :-)


 
TUser ©   (2006-04-30 09:51) [6]

Конструкций типа
Result := Result +
лучше избегать.


 
kilonet ©   (2006-04-30 09:58) [7]


> Конструкций типа
> Result := Result +
> лучше избегать.

почему?


 
TUser ©   (2006-04-30 10:14) [8]

Потому что они приводят к дефрагментации памяти. В данном случае, можно посчитать длину результата примерно так
i:=<число пробелов во входной строке>
SetLength (result, length(Input) + i shl 1)

и дальше уже просто задавать нужный символ Result[n] := ...


 
homm ©   (2006-04-30 11:30) [9]


> Потому что они приводят к дефрагментации памяти.

???

Фрагментации?


 
TUser ©   (2006-04-30 12:18) [10]

Конечно, оговорился.


 
DrPass ©   (2006-04-30 12:34) [11]


> i:=<число пробелов во входной строке>
> SetLength (result, length(Input) + i shl 1)
>
> и дальше уже просто задавать нужный символ Result[n] :=
> ...

Убивать за такой код надо, а потом премии лишать :-)


 
SergP ©   (2006-04-30 14:10) [12]


> Убивать за такой код надо, а потом премии лишать :-)


Почему?


 
SergP ©   (2006-04-30 14:33) [13]


> DrPass ©   (30.04.06 12:34) [11]


Я когда не знал про существование

> Lamer@fools.ua ©   (29.04.06 23:51) [4]


то писал так:


function UrlCode(const Src: String): String;
var
EndLen,i: Integer;
begin
EndLen:=0;
SetLength(Result,Length(Src)*3);
for i := 1 to Length(Src) do
  begin
  inc (EndLen);
  If Src[i] in ["0".."9","A".."Z","a".."z"]
     then Result[EndLen]:=Src[i]
     else begin
          Result[EndLen] := "%";
          Move(IntToHex(Ord(Src[i]),2)[1],Result[EndLen+1],2);
          inc (EndLen,2);
          end;
  end;
SetLength(Result,EndLen);
end;


Если меня за это нужно убивать - то почему?



Страницы: 1 вся ветка

Текущий архив: 2006.05.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
1-1145198224
Volf_555
2006-04-16 18:37
2006.05.28
WARNING. Duplicate resource(s): Type 10 (RCDATA)


15-1146726042
mfender
2006-05-04 11:00
2006.05.28
Форматирование кода в IDE


3-1144404814
Russ
2006-04-07 14:13
2006.05.28
запрос для выбора данных из двух БД


4-1141659727
webpauk
2006-03-06 18:42
2006.05.28
RCDATA


2-1147356863
Близнец
2006-05-11 18:14
2006.05.28
SearchRec.Attr=faDirectory