Форум: "Прочее";
Текущий архив: 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.011 c