|
#1
|
||||
|
||||
URL и кириллица
Здравствуйте! Может, кто знает готовые функции для Дельфи для кодировки/декодировки кириллицы, как на этом сайте: http://meyerweb.com/eric/tools/dencoder/
|
#2
|
||||
|
||||
Ты про Quoted-printable? Там они просто в хекс формате. В indy вроде есть функционал для перекодирования.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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. |