Contamos con tu ayuda para difundir nuestros posts referente a las ciencias informáticas.
Solución:
Estoy 99 % seguro de que tal función no existe en RTL (a partir de Delphi 2009). Por supuesto, sin embargo, es trivial escribir tal función.
Actualizar
HTTPUtil.HTMLEscape es lo que estás buscando:
function HTMLEscape(const Str: string): string;
No me atrevo a publicar el código aquí (violación de derechos de autor, probablemente), pero la rutina es muy simple. Codifica “<", ">“, “&”, y para <
, >
, &
y "
. También reemplaza los caracteres #92, #160..#255 a códigos decimales, por ejemplo \
.
Este último paso no es necesario si el archivo es UTF-8, y también es ilógico, porque los caracteres especiales superiores, como ∮, se dejan como están, mientras que los caracteres especiales inferiores, como ×, están codificados.
Actualización 2
En respuesta a la respuesta de Stijn Sanders, realicé una prueba de rendimiento simple.
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.
la salida es
532031
801969
Parece que aquí hay un pequeño concurso 🙂 Aquí hay una implementación más:
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;
Actualización 1: se actualizó el código incorrecto proporcionado inicialmente.
Actualización 2: Y los tiempos:
HTMLEncode : 2286508597
HTMLEncode2: 3577001647
HTMLEncode3: 361039770
Usualmente solo uso este código:
function HTMLEncode(Data:string):string;
begin
Result:=
StringReplace(
StringReplace(
StringReplace(
StringReplace(
StringReplace(
Data,
'&','&',[rfReplaceAll]),
'<','<',[rfReplaceAll]),
'>','>',[rfReplaceAll]),
'"','"',[rfReplaceAll]),
#13#10,'
'#13#10,[rfReplaceAll]);
end;
(¿derechos de autor? es de código abierto)
Calificaciones y comentarios
Si te gustó nuestro trabajo, puedes dejar una sección acerca de qué te ha gustado de esta noticia.