我有一个报告,应该采取网格控制和生成HTML输出。网格中的一列可以显示多个值中的任何一个,或“任何”。当它输出到HTML时,当然最终会变成空白。
我可以写一些例程来使用StringReplace把它变成& lt; Any& gt;所以它会正确显示这个特定的情况,但是我认为RTL中可能有一个已经被测试了,它是正确的。有人知道我能找到吗?
解决方法
我有99%的确定这样的功能不存在于RTL(截至德尔福2009)。然而,当然,写这样的功能是微不足道的。
更新
HTTPUtil.HTMLEscape是您正在寻找的:
function HTMLEscape(const Str: string): string;
我不敢在这里发布代码(侵犯版权,大概),但是例程很简单。它将“<”,“>”,“&”和“”“编码到& lt;,& amp; amp; amp& amp; #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]); 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.
输出是
532031 801969