Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2015, 10:39   #1
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию decodeURIComponent и encodeURIComponent в Delphi

Здравствуйте! При парсинге данных с различных сайтов иногда попадаются закодированные строки (e-mail, телефоны). Видимо, таким образом администраторы сайтов пытаются предотвратить этот самый парсинг. Сколько не рыл в интернете, так и не смог найти что-то более-менее удобное для перевода в делфях строки вроде:
Код:
decodeURIComponent('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%5c%22%6d%61
%69%6c%74%6f%3a%73%61%6c%6f%6e%40%6a%6f%6c%69%2e%75%61%5c%22%3e%73%61%6c%6f%6e%40%6a%6f%6c%69%2e%75%61%3c%5c%2f%61%3e%27%29%3b')
в человеческий вид.

Пришлось писать самому, код работает, хотя и присутствуют не все возможные символы. Если кому-то надо, то их легко добавить в массивы, пользуясь таблицей символов в шестнадцатиричном виде.
Но суть не в этом. Что-то мне подсказывает, что мой код не самый совершенный быдлокод. Может, кто-нибудь знает, как его сделать более элегантным или, возможно, существует готовое решение, а я изобретаю велосипед?

Код:
function URIComponent(s:string; decode:Boolean):string;
const
  a:array[1..159] of string = ('20', '21', '22', '23', '24', '25', '26', '27', '28', '29',
                              '2A', '2B', '2C', '2D', '2E', '2F', '30', '31', '32', '33',
                              '34', '35', '36', '37', '38', '39', '3A', '3B', '3C', '3D',
                              '3E', '3F', '40', '41', '42', '43', '44', '45', '46', '47',
                              '48', '49', '4A', '4B', '4C', '4D', '4E', '4F', '50', '51',
                              '52', '53', '54', '55', '56', '57', '58', '59', '5A', '5B',
                              '5C', '5D', '5E', '5F', '60', '61', '62', '63', '64', '65',
                              '66', '67', '68', '69', '6A', '6B', '6C', '6D', '6E', '6F',
                              '70', '71', '72', '73', '74', '75', '76', '77', '78', '79',
                              '7A', '7B', '7C', '7D', '7E', 'C0', 'C1', 'C2', 'C3', 'C4',
                              'C5', 'C6', 'C7', 'C8', 'C9', 'CA', 'CB', 'CC', 'CD', 'CE',
                              'CF', 'D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8',
                              'D9', 'DA', 'DB', 'DC', 'DD', 'DE', 'DF', 'E0', 'E1', 'E2',
                              'E3', 'E4', 'E5', 'E6', 'E7', 'E8', 'E9', 'EA', 'EB', 'EC',
                              'ED', 'EE', 'EF', 'F0', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6',
                              'F7', 'F8', 'F9', 'FA', 'FB', 'FC', 'FD', 'FE', 'FF');
  b:array[1..159] of string = (' ', '!', '"', '#', '$', '%', '&', '''', '(', ')',
                              '*', '+', ',', '-', '.', '/', '0', '1', '2', '3',
                              '4', '5', '6', '7', '8', '9', ':', ';', '<', '=',
                              '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
                              'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
                              'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[',
                              '\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e',
                              'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
                              'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
                              'z', '{', '|', '}', '~', 'А', 'Б', 'В', 'Г', 'Д',
                              'Е', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О',
                              'П', 'Р', 'C', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш',
                              'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в',
                              'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м',
                              'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц',
                              'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');
var
  i:Integer;
begin
  if decode then
    begin
      Result:=s;
      for i:=1 to 159 do
        Result:=StringReplace(Result,'%'+a[i],b[i],[rfReplaceAll, rfIgnoreCase]);
    end
  else
    begin
      while Length(s)<>0 do
        begin
          for i:=1 to 159 do
            begin
              if s[1]=b[i] then
                Result:=Result+'%'+a[i];
            end;
          Delete(s,1,1);
        end;
    end;
end;

//использование

    URIComponent('mail@gmail.com', false); 
// на выходе будет "%6D%61%69%6C%40%67%6D%61%69%6C%2E%63%6F%6D"

    URIComponent('%6D%61%69%6C%40%67%6D%61%69%6C%2E%63%6F%6D', true); 
// на выходе будет "mail@gmail.com"
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 12.01.2015, 10:51   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Д7
Код:
uses IdURI;

procedure TForm1.Button1Click(Sender: TObject);
var s: String;
begin
  s:='%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%5c%22%6d%61'+
     '%69%6c%74%6f%3a%73%61%6c%6f%6e%40%6a%6f%6c%69%2e%75%61%5c%22%3e%73%61%6c%6f%6e%40%6a%6f%6c%69%2e%75%61%3c%5c%2f%61%3e%27%29%3b';
  Memo1.Lines.Add(TIdURI.URLDecode(s));
end;
Еще uses HTTPApp - там HTTPDecode
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 12.01.2015 в 10:55.
Аватар вне форума Ответить с цитированием
Старый 12.01.2015, 10:56   #3
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Действительно...
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программист Delphi который поможет доделать проект на Delphi XE3 BukTop2009 Фриланс 3 26.10.2012 23:51
Не изменяется интерфейс моей программы при переходе с Delphi 7 на Delphi 2010 Elvisnya Общие вопросы Delphi 3 28.04.2011 15:59
Rad Studio 2011 XE: новое в Delphi, C++ Builder, RadPHP и Delphi Prism savva-paladin Софт 18 02.10.2010 20:24
Delphi. Как нарисовать в Delphi два движущиеся шара с определенной скоростью? redred Общие вопросы Delphi 10 11.12.2007 10:43
Как открыть БД, написанную в Delphi если нf другой машине Delphi нет? dagarik БД в Delphi 7 22.10.2007 17:54