Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Вниз

Функции перекодирования безопасных 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.009 c
3-1144151066
skovorodka
2006-04-04 15:44
2006.05.28
Номера страниц в Rave Report


1-1145265006
dracula
2006-04-17 13:10
2006.05.28
Есть две программы, надо из одной в другую передать строку?


2-1147257446
Dyakon_Frost
2006-05-10 14:37
2006.05.28
Запись в файл в три столбца!


1-1145370011
Darvin
2006-04-18 18:20
2006.05.28
Отловить изменение текстовых свойств компонента


6-1138364986
i-s-v
2006-01-27 15:29
2006.05.28
IDocument





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский