![]() |
|
#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
|
|||
|
|||
![]() Спасибо, огромное!
![]() |