Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Помогите з запросом GET


Автор: AlexLogos 17.12.2010, 12:24
Народ, подскажите как перекодировать имена праметров запроса GET в такой вид "%D0%9F%D0"? И обратно.

Автор: Snowy 17.12.2010, 13:33
uses WinInet;
Код
function EncodeUrl(url: string): string;
var
  u: URL_COMPONENTS;
  d: dword;
  hst, usr, pas, pth, ext: string;
  procedure ZeroStr(var s: string; var pch: PChar; var sz: dword);
  begin
    sz := INTERNET_MAX_PATH_LENGTH;
    SetLength(s, sz); FillChar(s[1], sz * SizeOf(Char), 0); pch := PChar(s);
  end;
begin
  FillChar(u, SizeOf(u), 0); u.dwStructSize := sizeOf(u);
  ZeroStr(hst, u.lpszHostName, u.dwHostNameLength);
  ZeroStr(usr, u.lpszUserName, u.dwUserNameLength);
  ZeroStr(pas, u.lpszPassword, u.dwPasswordLength);
  ZeroStr(pth, u.lpszUrlPath, u.dwUrlPathLength);
  ZeroStr(ext, u.lpszExtraInfo, u.dwExtraInfoLength);
  InternetCrackUrl(PChar(url), Length(url), ICU_DECODE, u);
  d := INTERNET_MAX_PATH_LENGTH;
  SetLength(result, d); FillChar(result[1], d * SizeOf(Char), 0);
  InternetCreateUrl(u, ICU_ESCAPE, PChar(result), d);
  result := copy(result, 1, d);
end;
Пример использования:
Код
var s: string;
begin
  s := EncodeUrl('http://www.google.ru/search?q=Мама мыла раму');
  ShowMessage(s);
  ShellExecute(0, nil, PChar(s), nil, nil, SW_SHOWNORMAL);
end;


Добавлено через 1 минуту и 25 секунд
Данный вариант кода работает во всех версиях дельфи.

Автор: AlexLogos 17.12.2010, 13:59
Круто! Спасибо. Теперь бы обратное преобразование и я был бы счастлив)))

Автор: Snowy 17.12.2010, 14:25
Обратно абсолютно точно так же.
Только при сборке урла нужно убрать кодирование.
По сути функция состоит из двух частей:
Код
function EncodeUrl(url: string; code: Boolean = true): string;
var
  u: URL_COMPONENTS;
  d, c: dword;
  hst, usr, pas, pth, ext: string;
  procedure ZeroStr(var s: string; var pch: PChar; var sz: dword);
  begin
    sz := INTERNET_MAX_PATH_LENGTH;
    SetLength(s, sz); FillChar(s[1], sz * SizeOf(Char), 0); pch := PChar(s);
  end;
begin
  // Part 1 - Split URL - распилить URL на составляющие
  FillChar(u, SizeOf(u), 0); u.dwStructSize := sizeOf(u); // готовим структуру u (запчасти) для работы
  ZeroStr(hst, u.lpszHostName, u.dwHostNameLength);
  ZeroStr(usr, u.lpszUserName, u.dwUserNameLength);
  ZeroStr(pas, u.lpszPassword, u.dwPasswordLength);
  ZeroStr(pth, u.lpszUrlPath, u.dwUrlPathLength);
  ZeroStr(ext, u.lpszExtraInfo, u.dwExtraInfoLength);
  InternetCrackUrl(PChar(url), Length(url), ICU_DECODE, u); // ломает URL на части
  // Составляющие урла: hst, usr, pas, pth, ext
  // Part 2 - Combine URL - собрать URL из составляющих
  d := INTERNET_MAX_PATH_LENGTH;
  if code=true then c := ICU_ESCAPE else c := 0; // ICU_ESCAPE - кодировать URL, 0 - нет
  SetLength(result, d); FillChar(result[1], d * SizeOf(Char), 0);
  InternetCreateUrl(u, c, PChar(result), d); // Собирает URL из частей
  result := copy(result, 1, d);
end;

Пример:
Код
var s: string;
begin
  s := 'http://www.google.ru/search?q=Мама мыла раму'; // исходная строка
  s := EncodeUrl(s, true); // закодировали
  ShowMessage(s); // показали
  s := EncodeUrl(s, false); // раскодировали
  ShowMessage(s); // показали
end;

Автор: AlexLogos 17.12.2010, 18:10
Если посудить получается что я передаю URL, и в зависимости от второго параметра функции либо кодирую его либо нет. Но если я не кодирую я же получаю исходную строку. Я ничего не напутал?
Я имел в виду если у меня есть строка GET-запроса з кодированными параметрами, как мне увидеть эти параметры в кирилице (ибо в основном кодируются символы отличные от латиницы). Какой алгоритм переведения кирилицы в кодированную строку? Я заметил что одна буква кодируется двумя значениями "%..". Каким образом это происходит?

Но если я передаю функции уже закодированную строку я получаю ее разкодированной. понятно...

Автор: Snowy 20.12.2010, 14:02
Функция возвращает кодированную или декодированную строку независимо от того, какой вариант ты ей передашь.
InternetCrackUrl возвращает декодированный вариант, независимо от того, какой вариант подан на входе.
А уже InternetCreateUrl может этот декодированный вариант закодировать или нет...
В примере как раз и передаётся - первый раз исходная строка, второй раз уже кодированная строка.

Автор: AlexLogos 31.1.2011, 12:32
Спасибо товарисчи!!! Все работает!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)