Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Декодирование HTML-сущностей в Delphi 2009: пошаговое руководство

Delphi , Синтаксис , Кодировки

Подробное описание проблемы:

Разработчи, работающие в 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
        '&amp;': begin
          Cp := Sp;
          Inc(Sp);
          case Sp^ of
            'a': begin
              Cp := Sp;
              Inc(Sp, 3);
              Rp^ := '&amp;';
              end;
            'l', 'g': begin
              Cp := Sp;
              Inc(Sp,2);
              Rp^ := Sp^ = 'l' then '&lt;' else '&gt;';
              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
      '&amp;': begin
        Cp := Sp;
        Inc(Sp);
        case Sp^ of
          'a': begin
            Cp := Sp;
            Inc(Sp, 3);
            Rp^ := '&amp;';
          end;
          'l', 'g': begin
            Cp := Sp;
            Inc(Sp,2);
            Rp^ := Sp^ = 'l' then '&lt;' else '&gt;';
          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^, ['&amp;', '#', '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^ <> '&amp;#') and (Sp^ <> '&quot;') and (Sp^ <> '&lt;') and (Sp^ <> '&gt;') then
      Rp := Sp - 1;
    if Sp^ = '&' then
    begin
      Sp := Sp - 1;
      if Rp := Sp^ = ';' then
        Rp := Sp - 2;
    end;
    if (Sp^ = '&amp;') 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Кодировки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 18:02:20/0.0033531188964844/0