![]() |
|
|
#1
|
||||
|
||||
|
Здравствуйте! Может, кто знает готовые функции для Дельфи для кодировки/декодировки кириллицы, как на этом сайте: http://meyerweb.com/eric/tools/dencoder/
|
|
#2
|
||||
|
||||
|
Ты про Quoted-printable? Там они просто в хекс формате. В indy вроде есть функционал для перекодирования.
|
|
#3
|
||||
|
||||
|
Я вот эту функцию имел ввиду, может, есть уже готовые: http://ru.wikipedia.org/wiki/URL#.D0...0.B8.D0.B5_URL
|
|
#4
|
||||
|
||||
|
Какие проблемы? Сам же ссылку дал.
Цитата: "Такое преобразование происходит в два этапа: сначала каждый символ кириллицы кодируется в Юникоде (UTF-8) в последовательность из двух байтов, а затем каждый байт этой последовательности записывается в шестнадцатеричном представлении". Код:
function CharInSet(C: AnsiChar; const CharSet: TSysCharSet): Boolean;
begin
Result := C in CharSet;
end;
function URLEncode(const Url: Utf8String): string;
var
I: Integer;
begin
Result := '';
for I := 1 to Length(Url) do begin
if CharInSet(Url[i], ['A'..'Z', 'a'..'z', '0'..'9', '-', '=', '&', ':', '/', '?', ';', '_']) then
Result := Result + Utf8ToAnsi(Url[i])
else
Result := Result + '%' + IntToHex(Ord(Url[i]), 2);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(URLEncode('Вот текст для perevoda 123789'));
end; |
|
#5
|
||||
|
||||
|
Проблема с декодировкой, т.е. обратно перевести.
|
|
#6
|
||||
|
||||
|
Искать пробовали???
Код:
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; |
|
#7
|
||||
|
||||
|
Конечно пробовал:
|
|
#8
|
||||
|
||||
|
Начиная с Delphi2009, имеется полная поддержка кодировки Unicode. Выше приведенный код работает на Делфи7 (т.к. там все AnsiString).
|
|
#9
|
||||
|
||||
|
Т.е. в ДXE никак не заставить работать?
|
|
#10
|
||||
|
||||
|
Замени везде String -> AnsiString, Char - AnsiChar, PChar - PAnsiChar.
Код:
function UrlEncode(Str: ansistring): ansistring;
function CharToHex(Ch: ansiChar): 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: ansiChar;
N: Integer;
P: PansiChar;
begin
Result := '';
Len := Length(Str);
P := PansiChar(@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: Ansistring): Ansistring;
function HexToChar(W: word): AnsiChar;
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: PAnsiChar; var Ch: AnsiChar): AnsiChar;
begin
Ch := P^;
Result := Ch;
end;
var
P: PAnsiChar;
Ch: AnsiChar;
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;
Edit1.Text:= UrlEncode(Edit1.Text);
Edit2.Text:=URLDecode(edit1.Text); |
|
#11
|
||||
|
||||
|
Спасибо. Все работает!
П.С. Код:
Edit1.Text:=UrlEncode(AnsiToUtf8('тест'));
Edit2.Text:=Utf8ToAnsi(UrlDecode(Edit1.Text));Последний раз редактировалось adidas, 11.09.2011 в 14:58. |