![]() |
|
|
|
|
#1
|
|||
|
|||
|
Ниже - широко распространённые в сети функции для %-кодирования строки.
Код:
function DigitToHex(Digit: Integer): Char;
begin
case Digit of
0..9: Result := Chr(Digit + Ord('0'));
10..15: Result := Chr(Digit - 10 + Ord('A'));
else
Result := '0';
end;
end; // DigitToHex
function URLEncode(const S: string): string;
var
i, idx, len: Integer;
begin
len := 0;
for i := 1 to Length(S) do
if ((S[i] >= '0') and (S[i] <= '9')) or
((S[i] >= 'A') and (S[i] <= 'Z')) or
((S[i] >= 'a') and (S[i] <= 'z')) or (S[i] = ' ') or
(S[i] = '_') or (S[i] = '*') or (S[i] = '-') or (S[i] = '.') then
len := len + 1
else
len := len + 3;
SetLength(Result, len);
idx := 1;
for i := 1 to Length(S) do
if S[i] = ' ' then
begin
Result[idx] := '+';
idx := idx + 1;
end
else if ((S[i] >= '0') and (S[i] <= '9')) or
((S[i] >= 'A') and (S[i] <= 'Z')) or
((S[i] >= 'a') and (S[i] <= 'z')) or
(S[i] = '_') or (S[i] = '*') or (S[i] = '-') or (S[i] = '.') then
begin
Result[idx] := S[i];
idx := idx + 1;
end
else
begin
Result[idx] := '%';
Result[idx + 1] := DigitToHex(Ord(S[i]) div 16);
Result[idx + 2] := DigitToHex(Ord(S[i]) mod 16);
idx := idx + 3;
end;
end; // URLEncode
function URLDecode(const S: string): string;
var
i, idx, len, n_coded: Integer;
function WebHexToInt(HexChar: Char): Integer;
begin
if HexChar < '0' then
Result := Ord(HexChar) + 256 - Ord('0')
else if HexChar <= Chr(Ord('A') - 1) then
Result := Ord(HexChar) - Ord('0')
else if HexChar <= Chr(Ord('a') - 1) then
Result := Ord(HexChar) - Ord('A') + 10
else
Result := Ord(HexChar) - Ord('a') + 10;
end;
begin
len := 0;
n_coded := 0;
for i := 1 to Length(S) do
if n_coded >= 1 then
begin
n_coded := n_coded + 1;
if n_coded >= 3 then
n_coded := 0;
end
else
begin
len := len + 1;
if S[i] = '%' then
n_coded := 1;
end;
SetLength(Result, len);
idx := 0;
n_coded := 0;
for i := 1 to Length(S) do
if n_coded >= 1 then
begin
n_coded := n_coded + 1;
if n_coded >= 3 then
begin
Result[idx] := Chr((WebHexToInt(S[i - 1]) * 16 +
WebHexToInt(S[i])) mod 256);
n_coded := 0;
end;
end
else
begin
idx := idx + 1;
if S[i] = '%' then
n_coded := 1;
if S[i] = '+' then
Result[idx] := ' '
else
Result[idx] := S[i];
end;
end; // URLDecodeПроблема в том, что кодировать мне нужно не строку в win 1251, а в UTF-8. Нижеприведённый код выдаст лажу. Код:
procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption:=UrlEncode(Edit1.Text); end; Дело в том, что в Edit1.Text текст в неверной кодировке. Вопрос! Как подать функции UrlEncode текст из Edit1 в UTF-8? Перепробовал всякие AnsiToUTF - что-то результата нет. Неужели нужно ставить iconv? |
|
#2
|
|||
|
|||
|
Пока замутил такой вот суррогат:
Код:
function encodeme(s: string): string;
const
rus: string = 'абвгдеёжзийклмнопрстуфхцчшщьыъэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ';
utf: array[1..66] of string = ('%D0%B0', '%D0%B1', '%D0%B2', '%D0%B3', '%D0%B4', '%D0%B5', '%D1%91', '%D0%B6', '%D0%B7', '%D0%B8', '%D0%B9', '%D0%BA', '%D0%BB', '%D0%BC', '%D0%BD', '%D0%BE', '%D0%BF', '%D1%80', '%D1%81', '%D1%82', '%D1%83', '%D1%84', '%D1%85', '%D1%86', '%D1%87', '%D1%88', '%D1%89', '%D1%8C', '%D1%8B', '%D1%8A', '%D1%8D', '%D1%8E', '%D1%8F', '%D0%90', '%D0%91', '%D0%92', '%D0%93', '%D0%94', '%D0%95', '%D0%81', '%D0%96', '%D0%97', '%D0%98', '%D0%99', '%D0%9A', '%D0%9B', '%D0%9C', '%D0%9D', '%D0%9E', '%D0%9F', '%D0%A0', '%D0%A1', '%D0%A2', '%D0%A3', '%D0%A4', '%D0%A5', '%D0%A6', '%D0%A7', '%D0%A8', '%D0%A9', '%D0%AC', '%D0%AB', '%D0%AA', '%D0%AD', '%D0%AE', '%D0%AF');
var
p, i, l: integer;
begin
Result := '';
l := Length(s);
for i := 1 to l do
begin
p := Pos(s[i], rus);
if p<1 then Result := Result + s[i] else Result := Result + utf[p];
end;
end;![]() |
|
#3
|
||||
|
||||
|
Справка:
Цитата:
Ф-я нужно еще добавить незаменяемые символы Код:
function UrlEncode(S: Utf8String): String;
var
I: Integer;
begin
Result := '';
for I := 1 to Length(S)do
if S[i] in ['a'..'z', 'A'..'Z'] then
Result := Result + S[i]
else
Result := Result + '%' + IntToHex(Ord(S[i]), 2);
end;используем Код:
Memo1.Lines.Add(UrlEncode(AnsiToUtf8('Учится, учится и еще раз учится'))); |
|
#4
|
|||
|
|||
|
Спасибо, огромное!
![]() |