Разработчи, работающие в Delphi 2009 и сталкивающиеся с задачей декодирования строк, содержащих HTML-сущности, например, ' (одинарные кавычки), сталкивают трудность с отсутствием встроенных функций для выполнения этой задачи. Встроенный компонент HTTPApp содержит функции HTTPDecode и HTMLDecode, которые могут быть использованы для решения этой проблемы.
Предложенное решение:
Следует воспользоваться функцией из модуля HTTPApp, доступного в папке Source/Win32/Internet. Пример использования функции HTMLDecode приведен ниже:
function HTMLDecode(const AStr: string): string;
var
Sp, Rp, Cp, Tp: PChar;
begin
SetLength(Result, Length(AStr));
Sp := PChar(AStr);
Rp := PChar(Result);
Cp := Sp;
try
while Sp^ <> #0 do
begin
case Sp^ of
'&': begin
Cp := Sp;
Inc(Sp);
case Sp^ of
'a': begin
Cp := Sp;
Inc(Sp, 3);
Rp^ := '&';
end;
'l', 'g': begin
Cp := Sp;
Inc(Sp,2);
Rp^ := Sp^ = 'l' then '<' else '>';
end;
'n': begin
Inc(Sp,4);
Rp^ := ' ';
end;
'q': begin
Inc(Sp,4);
Rp^ := '"';
end;
'#': begin
Tp := Sp;
Inc(Tp);
while (Sp^ <> ';') and (Sp^ <> #0) do
Inc(Sp);
SetString(S, Tp, Sp - Tp);
Val(S, I, Code);
Rp^ := Chr((I));
end;
else
Exit;
end;
Inc(Rp);
Inc(Sp);
end;
else
Rp^ := Sp^;
Inc(Rp);
Inc(Sp);
end;
finally
SetLength(Result, Rp - PChar(Result));
end;
end;
Альтернативное решение:
Если по каким-то причинам использование встроенной функции не представляется возможным, можно написать собственную функцию для декодирования HTML-сущностей. Пример такой функции:
function HTMLDecode(const AStr: string): string;
var
Sp, Rp, Cp, Rc, Ee: PChar;
S: string;
I, Code: Integer;
begin
SetLength(Result, Length(AStr));
Sp := PChar(AStr);
Rp := PChar(Result);
Cp := Sp;
try
while Sp^ <> #0 do
case Sp^ of
'&': begin
Cp := Sp;
Inc(Sp);
case Sp^ of
'a': begin
Cp := Sp;
Inc(Sp, 3);
Rp^ := '&';
end;
'l', 'g': begin
Cp := Sp;
Inc(Sp,2);
Rp^ := Sp^ = 'l' then '<' else '>';
end;
'q': begin
Cp := Sp;
Inc(Sp,4);
Rp^ := '"';
end;
'#': begin
Tp := Sp;
Inc(Tp);
while (Sp^ <> ';') and (Sp^ <> #0) do
Inc(Sp);
SetLength(S, Tp - Sp + 1);
StrLCopy(S, Tp, Sp - Tp);
Val(S, I, Code);
Rp^ := Chr(Code);
end;
'n': begin
Inc(Sp,4);
Rp^ := ' ';
end;
else
Exit;
end;
Inc(Rp);
Inc(Sp);
end;
else
Rp^ := Sp^;
Inc(Rp);
Inc(Sp);
end;
Ee := FindCharInSet(Sp^, ['&', '#', 'q', 'l', 'g', 'n']);
if Ee = 0 then
begin
Rp^ := Sp^;
Inc(Rp);
Inc(Sp);
end;
if E4 := FindCharInSet(Sp^, [';']) = 0 then
Exit;
Rp := Rp - 1;
if (Sp^ <> '&#') and (Sp^ <> '"') and (Sp^ <> '<') and (Sp^ <> '>') then
Rp := Sp - 1;
if Sp^ = '&' then
begin
Sp := Sp - 1;
if Rp := Sp^ = ';' then
Rp := Sp - 2;
end;
if (Sp^ = '&') and (Rp := Sp^ = '#') then
begin
if Rp := Sp^ = '#' then
begin
Rc := Sp;
Inc(Rc);
S := '';
while (Sp^ <> ';') and (Sp^ <> #0) do
S := S + Sp^;
Inc(Sp);
SetLength(S, Rc - Sp + 1);
StrLCopy(S, Rc, Sp - Rc);
Val(S, I, Code);
Rp^ := Chr(Code);
end;
end;
SetLength(Result, Rp - PChar(Result));
end;
end;
Комментарии к использованию:
Убедитесь, что ваша программа поддерживает кириллические строки, если вы работаете с многоязыковыми текстами, так как функция Val использует строку в ASCII-формате для преобразования в число.
Заключение
Для работы с HTML-сущностями в Delphi 2009, вы можете использовать встроенные функции HTMLDecode из модуля HTTPApp, расположенного в папке Source/Win32/Internet, или же написать собственную функцию для декодирования. Убедитесь, что выбранный подход соответствует требованиям вашего приложения и его совместимости с используемыми строками и кодировками.
Предложено руководство по декодированию HTML-сущностей в среде Delphi 2009, включая примеры использования встроенной функции `HTMLDecode` и описание альтернативного метода декодирования.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.