Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите з запросом GET, кодирование имен параметров 
V
    Опции темы
AlexLogos
Дата 17.12.2010, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



Народ, подскажите как перекодировать имена праметров запроса GET в такой вид "%D0%9F%D0"? И обратно.
PM MAIL   Вверх
Snowy
Дата 17.12.2010, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



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 секунд
Данный вариант кода работает во всех версиях дельфи.
PM MAIL   Вверх
AlexLogos
Дата 17.12.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



Круто! Спасибо. Теперь бы обратное преобразование и я был бы счастлив)))
PM MAIL   Вверх
Snowy
Дата 17.12.2010, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Обратно абсолютно точно так же.
Только при сборке урла нужно убрать кодирование.
По сути функция состоит из двух частей:
Код
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;

PM MAIL   Вверх
AlexLogos
Дата 17.12.2010, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



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

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

Это сообщение отредактировал(а) AlexLogos - 17.12.2010, 18:13
PM MAIL   Вверх
Snowy
Дата 20.12.2010, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Функция возвращает кодированную или декодированную строку независимо от того, какой вариант ты ей передашь.
InternetCrackUrl возвращает декодированный вариант, независимо от того, какой вариант подан на входе.
А уже InternetCreateUrl может этот декодированный вариант закодировать или нет...
В примере как раз и передаётся - первый раз исходная строка, второй раз уже кодированная строка.
PM MAIL   Вверх
AlexLogos
Дата 31.1.2011, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



Спасибо товарисчи!!! Все работает!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0832 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.