XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Общение> Hard & Soft
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
ELForcer
Сижу only Hard & Soft
offline
Опыт: 1,593
Активность:
UrlUnescape Function в Delphi
Нашел такую функцию для раскодировки символов вида %u0438:

Код:
function UrlUnescape(pszURL: PAnsiChar; pszUnescaped: PAnsiChar; 
var pcchUnescaped: DWORD; dwFlags: DWORD): HResult; external 'shlwapi.dll' name 'UrlUnescapeA';

Описание функции

Вопросы такие:
1. В переменную pcchUnescaped нужно задавать количество символов в закодированном виде или число сколько надо раскодировать? То есть в закодированном виде %u0438 будет 6 символов, а в раскодированном 1.

2. Чему равны флаги URL_DONT_UNESCAPE_EXTRA_INFO и URL_UNESCAPE_INPLACE ? Имеется ввиду под этими константами скрыты числа.

Если кто то работал с этой функцией буду благодарен за рабочий пример. Если же нет придется тыкаться самому.
Старый 26.05.2010, 23:02
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
  1. Здесь в принципе можно ничего не задавать и использовать это как пустышку (так как nil не катит). Возвращает длину записанных на выходе данных.
2.
URL_DONT_ESCAPE_EXTRA_INFO   = $02000000;

URL_DONT_UNESCAPE_EXTRA_INFO = URL_DONT_ESCAPE_EXTRA_INFO;

URL_UNESCAPE_INPLACE         = $00100000;
3.
uses ShLwApi; // здесь описана функция UrlUnescape

function UrlUnescapeWrap(Url: String): String;
var
  buf: Array [0..2056] Of Char;
  len: DWord;
begin
  UrlUnescape(PChar(Url), buf, @len, $02000000);
  Result := Utf8ToAnsi(buf); // для читабельности русских символов
end;
Старый 27.05.2010, 08:26
ELForcer
Сижу only Hard & Soft
offline
Опыт: 1,593
Активность:
Ругается на переменную @len: Types of actual and formal var parameters must be identical.

Без собачки запускается но при раскодировки ругается и всё равно ничего не преобразует.

Код:
---------------------------
Debugger Exception Notification
---------------------------
Project Project2.exe raised exception class EAccessViolation with message 'Access violation at address 77F087BC in module 'shlwapi.dll'. Read of address 02000000'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------

С uses ShLwApi; Тоже не работает. Даже если кинуть в корневой каталог.

Отредактировано ELForcer, 27.05.2010 в 11:51.
Старый 27.05.2010, 11:42
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Подключи модуль Windows (если не подключен), там есть декларация:
  ...
  PDWORD = ^DWORD;
  {$EXTERNALSYM PDWORD}
  LPDWORD = PDWORD;
  {$EXTERNALSYM LPDWORD}
  ...
В архиве лежит пример.
Прикрепленные файлы
Тип файла: rar ShLwApi.rar (186.0 Кбайт, 36 просмотров )
Старый 27.05.2010, 12:27
ELForcer
Сижу only Hard & Soft
offline
Опыт: 1,593
Активность:
Хм. Странно. Твой пример не конвертирует %u0438. Ладно это тоже пригодится, спасибо.

Если можешь помочь есть еще один код с которым тоже не разобрался
Код:
type pword = ^word;
(*integer*) i := StrToInt('$'+ Copy('%u0417', 3, 1000))
(*WideChar wc*)  pword(@wc)^ := i;

После преобразования вылазит число. Теперь вопрос: Как его преобразовать в соответствующий символ?
Старый 27.05.2010, 12:30
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Так у тебя код написан уже, в wc будет символ в формате юникода. Сконвертировать в строку можно функцией WideCharToString():
function CodeToString(Input: String): String;
var
  i:  Integer;
  wc: WideChar;
begin
  i  := StrToInt('$'+ Copy(Input, 3, 4));
  wc := PWideChar(@i)^;
  Result := PChar(WideCharToString(@wc))^;
end;
Выкрутас с PChar(...)^ нужен, чтобы явно привести к однобайтовому символу. Если написать просто WideCharToString(wc), то в строке str окажется два одинаковых символа.
Старый 27.05.2010, 19:10
ELForcer
Сижу only Hard & Soft
offline
Опыт: 1,593
Активность:
ShadoW DaemoN, спасибо, завтра попробую. Я пока просто подобрал код символа, вычев 848 (или не помню сколько уже). Проверил на русском алфавите - работало. А английский вроде предыдущая функция должна раскодировать.
Старый 27.05.2010, 21:47
ELForcer
Сижу only Hard & Soft
offline
Опыт: 1,593
Активность:
ShadoW DaemoN, Ругается на строку: i := StrToInt('$'+ Copy(Input, 3, 4));
Incompatible types: 'String' and 'PAnsiChar'

Сделал i := StrToInt(PChar('$'+ Copy(Input, 3, 4))); Ща посмотрим что будет.
Старый 28.05.2010, 12:49
Ответ

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

Расширенный поиск

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

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



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