是否有Delphi标准函数用于转义HTML? [英] Is there a Delphi standard function for escaping HTML?
问题描述
< Any>
。当它输出到HTML时,当然最终会变为空白。 我可能会写一些例程来使用StringReplace将其转换为 & lt; Any& gt;
,所以它会正确显示这个特定的情况,但是我认为RTL中可能有一个已经被测试,并且是正确的。任何人都知道我在哪里可以找到它?
我99%肯定这样的功能不存在于RTL的德尔福2009)。然而,当然,写这样一个功能是微不足道的。
更新
HTTPUtil.HTMLEscape是你正在寻找的:
function HTMLEscape(const Str:string ):string;
我不敢在这里发布代码(侵犯版权,大概),但是例程是很简单。它将<,>,&和编码到& lt;
,& / code>,
& amp; amp;
和& quot;
,还可以替换字符#92 ,#160 ..#255到十进制代码,例如&#92;
。
后一步是如果文件是UTF-8,则不必要,也是不合逻辑的,因为较高的特殊字符(如∮)保持原样,而较低的特殊字符(如×)被编码。
更新2
为了回应Stijn Sanders的回答,我做了一个简单的性能测试。
程序Project1;
{$ APPTYPE CONSOLE}
使用
Windows,SysUtils;
var
t1,t2,t3,t4:Int64;
i:整数;
str:string;
const
N = 100000;
函数HTMLEncode(const Data:string):string;
var
i:Integer;
begin
result:='';
for i:= 1 to length(Data )do
case
'<':result:= result +'& lt;';的数据[i]
'>':result:= result +'& gt;';
'&':result:= result +'& amp;';
':result:= result +'& quot;';
else
result:= result + Data [i];
end;
end;
function HTMLEncode2(Data:string):string;
begin
结果:=
StringReplace(
StringReplace(
StringReplace(
StringReplace(
Data,
'&','& amp;',[rfReplaceAll]),
'<','& ',[rfReplaceAll]),
'>','& gt;',[rfReplaceAll]),
'','& quot;',[rfReplaceAll]);
结束
begin
QueryPerformanceCounter(t1);
for i:= 0 to N - 1 do
str:= HTMLEncode('Testing。Is 3 * 4< 3 + 4?你喜欢A& B
QueryPerformanceCounter(t2);
QueryPerformanceCounter(t3);
for i:= 0 to N - 1 do
str:= HTMLEncode2('Testing。Is 3 * 4< 3 + 4?你喜欢A& B
QueryPerformanceCounter(t4);
Writeln(IntToStr(t2-t1));
Writeln(IntToStr(t4-t3));
Readln;
结束。
输出是
532031
801969
I've got a report that's supposed to take a grid control and produce HTML output. One of the columns in the grid can display any of a number of values, or <Any>
. When this gets output to HTML, of course, it ends up blank.
I could probably write up some routine to use StringReplace to turn that into <Any>
so it would display this particular case correctly, but I figure there's probably one in the RTL somewhere that's already been tested and does it right. Anyone know where I could find it?
I am 99 % sure that such a function does not exist in the RTL (as of Delphi 2009). Of course - however - it is trivial to write such a function.
Update
HTTPUtil.HTMLEscape is what you are looking for:
function HTMLEscape(const Str: string): string;
I don't dare to publish the code here (copyright violation, probably), but the routine is very simple. It encodes "<", ">", "&", and """ to <
, >
, &
, and "
. It also replaces characters #92, #160..#255 to decimal codes, e.g. \
.
This latter step is unnecessary if the file is UTF-8, and also illogical, because higher special characters, such as ∮ are left as they are, while lower special characters, such as ×, are encoded.
Update 2
In response to the answer by Stijn Sanders, I made a simple performance test.
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.
The output is
532031
801969
这篇关于是否有Delphi标准函数用于转义HTML?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!