Mas*_*ler 26 html delphi escaping
我有一个报告,它应该采用网格控件并生成HTML输出.网格中的一列可以显示任意数量的值,或<Any>.当它输出到HTML时,它当然是空白的.
我可能会编写一些例程来使用StringReplace来将其转换为<Any>正确显示这个特定情况,但我认为RTL中可能有一个已经过测试并且正确的情况.谁知道我能在哪里找到它?
And*_*and 18
我99%确定RTL中不存在这样的功能(从Delphi 2009开始).当然 - 然而 - 编写这样的函数是微不足道的.
更新
您正在寻找HTTPUtil.HTMLEscape:
function HTMLEscape(const Str: string): string;
Run Code Online (Sandbox Code Playgroud)
我不敢在这里发布代码(版权侵犯,可能),但例程非常简单.它编码"<", ">", "&",和"""来<,>,&,和",还替换字符#92,#160 ..#255为十进制码,例如\.
如果文件是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 + '<';
'>': result := result + '>';
'&': result := result + '&';
'"': result := result + '"';
else
result := result + Data[i];
end;
end;
function HTMLEncode2(Data: string):string;
begin
Result:=
StringReplace(
StringReplace(
StringReplace(
StringReplace(
Data,
'&','&',[rfReplaceAll]),
'<','<',[rfReplaceAll]),
'>','>',[rfReplaceAll]),
'"','"',[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('<');
'>': Encode('>');
'&': Encode('&');
'"': Encode('"');
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)