Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.10.2010, 11:59
MrDiG MrDiG вне форума
Начинающий
 
Регистрация: 05.10.2010
Сообщения: 112
Репутация: 1227
По умолчанию UrlEncode и UTF8

Ниже - широко распространённые в сети функции для %-кодирования строки.
Код:
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  
Старый 19.10.2010, 12:50
MrDiG MrDiG вне форума
Начинающий
 
Регистрация: 05.10.2010
Сообщения: 112
Репутация: 1227
По умолчанию

Пока замутил такой вот суррогат:
Код:
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  
Старый 19.10.2010, 14:15
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

Справка:
Цитата:
encodeURI
Синтаксис
encodeURI(URI)

Аргументы
URI
строка URI

Описание, примеры
Метод предполагает, что переданный параметр является полным URI, поэтому не кодирует зарезервированные значения, которые имеют специальные значения в URI.

Метод encodeURI заменяет все символы, исключая следующие, соответствующими им UTF-8 escape-последовательностями.

Тип
Включает в себя

Зарезервированные
; , / ? : @ & = + $

Незаменяемые символы
латинский алфавит, десятичные цифры, - _ . ! ~ * ' ( )

Значок решетки
#

Заметим, что encodeURI не может формировать данные для GET или POST-запросов, например, для XMLHttpRequest, так как "&", "+", и "=" не кодируются - а они являются специальными символами.

Ф-я нужно еще добавить незаменяемые символы
Код:
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  
Старый 19.10.2010, 15:33
MrDiG MrDiG вне форума
Начинающий
 
Регистрация: 05.10.2010
Сообщения: 112
Репутация: 1227
По умолчанию

Спасибо, огромное!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025