是否有用于转义HTML的Delphi标准函数?

Mas*_*ler 26 html delphi escaping

我有一个报告,它应该采用网格控件并生成HTML输出.网格中的一列可以显示任意数量的值,或<Any>.当它输出到HTML时,它当然是空白的.

我可能会编写一些例程来使用StringReplace来将其转换为&lt;Any&gt;正确显示这个特定情况,但我认为RTL中可能有一个已经过测试并且正确的情况.谁知道我能在哪里找到它?

And*_*and 18

我99%确定RTL中不存在这样的功能(从Delphi 2009开始).当然 - 然而 - 编写这样的函数是微不足道的.

更新

您正在寻找HTTPUtil.HTMLEscape:

function HTMLEscape(const Str: string): string;
Run Code Online (Sandbox Code Playgroud)

我不敢在这里发布代码(版权侵犯,可能),但例程非常简单.它编码"<", ">", "&",和"""来&lt;,&gt;,&amp;,和&quot;,还替换字符#92,#160 ..#255为十进制码,例如&#92;.

如果文件是UTF-8,则后一步是不必要的,并且也是不合逻辑的,因为较高的特殊字符(例如∮)保持不变,而较低的特殊字符(例如×)被编码.

更新2

为了回应Stijn Sanders的回答,我做了一个简单的性能测试.

program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

var
  t1, t2, t3, t4: Int64;
  i: Integer;
  str: string;
const
  N = 100000;


function HTMLEncode(const Data: string): string;
var
  i: Integer;
begin

  result := '';
  for i := 1 to length(Data) do
    case Data[i] of
      '<': result := result + '&lt;';
      '>': result := result + '&gt;';
      '&': result := result + '&amp;';
      '"': result := result + '&quot;';
    else
      result := result + Data[i];
    end;

end;

function HTMLEncode2(Data: string):string;
begin
  Result:=
    StringReplace(
    StringReplace(
    StringReplace(
    StringReplace(
      Data,
      '&','&amp;',[rfReplaceAll]),
      '<','&lt;',[rfReplaceAll]),
      '>','&gt;',[rfReplaceAll]),
      '"','&quot;',[rfReplaceAll]);
end;

begin

  QueryPerformanceCounter(t1);
  for i := 0 to N - 1 do
    str := HTMLEncode('Testing. Is 3*4<3+4? Do you like "A & B"');
  QueryPerformanceCounter(t2);

  QueryPerformanceCounter(t3);
  for i := 0 to N - 1 do
    str := HTMLEncode2('Testing. Is 3*4<3+4? Do you like "A & B"');
  QueryPerformanceCounter(t4);

  Writeln(IntToStr(t2-t1));
  Writeln(IntToStr(t4-t3));

  Readln;


end.
Run Code Online (Sandbox Code Playgroud)

输出是

532031
801969
Run Code Online (Sandbox Code Playgroud)


da-*_*oft 13

这似乎是一个小比赛:)这是一个更多的实现:

function HTMLEncode3(const Data: string): string;
var
  iPos, i: Integer;

  procedure Encode(const AStr: String);
  begin
    Move(AStr[1], result[iPos], Length(AStr) * SizeOf(Char));
    Inc(iPos, Length(AStr));
  end;

begin
  SetLength(result, Length(Data) * 6);
  iPos := 1;
  for i := 1 to length(Data) do
    case Data[i] of
      '<': Encode('&lt;');
      '>': Encode('&gt;');
      '&': Encode('&amp;');
      '"': Encode('&quot;');
    else
      result[iPos] := Data[i];
      Inc(iPos);
    end;
  SetLength(result, iPos - 1);
end;
Run Code Online (Sandbox Code Playgroud)

更新1:更新最初提供的代码不正确.

更新2:时间:

HTMLEncode :   2286508597
HTMLEncode2:   3577001647
HTMLEncode3:    361039770
Run Code Online (Sandbox Code Playgroud)