将delphi字符串转义到JavaScript函数
我需要将表数据库中的字段内容传递给网页中的JavaSricpt函数 当字符串中有反斜杠时,我发现一个错误:将delphi字符串转义到JavaScript函数,javascript,delphi,Javascript,Delphi,我需要将表数据库中的字段内容传递给网页中的JavaSricpt函数 当字符串中有反斜杠时,我发现一个错误: {"DT_RowId":"4427","pront":"4427","nome":"JOHN DOE","conv":"PETROBRAS\ DISTR ( R)","cpf":"","email":""} 见:“巴西石油公司” 在本例中,我发现反斜杠是问题的原因 function TContentClient.select_client(aParams: TStrings): var
{"DT_RowId":"4427","pront":"4427","nome":"JOHN DOE","conv":"PETROBRAS\ DISTR ( R)","cpf":"","email":""}
见:“巴西石油公司”
在本例中,我发现反斜杠是问题的原因
function TContentClient.select_client(aParams: TStrings):
var so,jsoItem:TJsonObject;
jsa:TJsonArray;
jsp:TJSONPair;
ds:Tdataset;
.....
begin
TJsonObject;_recordsTotal:=IntToStr(ds.RecordCount);
jso:=TJsonObject.Create;
jso.AddPair('draw',TJsonNumber.Create(_draw));
jso.AddPair('recordsTotal',TJsonNumber.Create(_recordsTotal));
jso.AddPair('recordsFiltered',TJsonNumber.Create(_recordsTotal));
//create an json-array
jsa := TJsonArray.Create();
//add array to object
while not ds.eof do begin
//add items to the _first_ elemet of array
jsoItem := TJsonObject.Create();
//add object pairs
jsoItem.AddPair(TJsonPair.Create('DT_RowId',TJsonString.Create(ds.FieldByname('pront').AsString)));
jsoItem.AddPair(TJsonPair.Create('pront', TJsonString.Create(ds.FieldByname('pront').AsString)));
jsoItem.AddPair(TJsonPair.Create('nome', TJsonString.Create(ds.FieldByname('nome').AsString)));
jsoItem.AddPair(TJsonPair.Create('endereco', TJsonString.Create(ds.FieldByname('endereco').AsString)));
jsoItem.AddPair(TJsonPair.Create('bairro', TJsonString.Create(ds.FieldByname('bairro').AsString)));
jsoItem.AddPair(TJsonPair.Create('cidade', TJsonString.Create(ds.FieldByname('cidade').AsString)));
jsoItem.AddPair(TJsonPair.Create('estado', TJsonString.Create(ds.FieldByname('estado').AsString)));
jsoItem.AddPair(TJsonPair.Create('telefone', TJsonString.Create(ds.FieldByname('telres').AsString)));
jsoItem.AddPair(TJsonPair.Create('convenio', TJsonString.Create(ds.FieldByname('convenio').AsString)));
jsoItem.AddPair(TJsonPair.Create('cpf', TJsonString.Create(ds.FieldByname('cpf').AsString)));
jsoItem.AddPair(TJsonPair.Create('email', TJsonString.Create(ds.FieldByname('email').AsString)));
//put it into array
jsa.AddElement(jsoItem);
ds.Next;
end;
jsp := TJSONPair.Create('data', jsa);
jso.AddPair(jsp);
result:=jso;
end;
我知道我可以解决这个特定的问题,但是我使用的表数据库有很多行,而且可能还有其他字符,这些字符可能会给我的页面中的JavaScript带来问题
是否有一个delphi函数来转义delphi字符串中的所有无效字符(考虑JavaScript),以便传递给jasvascript函数
function EscapeDelphiStringToJS(s:string):string
begin
result:= "how could I do the escaping?"
end;
Remy,这是我用来创建Json的代码。我正在使用XE8
为了将数据返回到我的ajax函数,我只需使用以下命令将结果函数转换为字符串:jso.tostring;但是,这不是问题所在
function TContentClient.select_client(aParams: TStrings):
var so,jsoItem:TJsonObject;
jsa:TJsonArray;
jsp:TJSONPair;
ds:Tdataset;
.....
begin
TJsonObject;_recordsTotal:=IntToStr(ds.RecordCount);
jso:=TJsonObject.Create;
jso.AddPair('draw',TJsonNumber.Create(_draw));
jso.AddPair('recordsTotal',TJsonNumber.Create(_recordsTotal));
jso.AddPair('recordsFiltered',TJsonNumber.Create(_recordsTotal));
//create an json-array
jsa := TJsonArray.Create();
//add array to object
while not ds.eof do begin
//add items to the _first_ elemet of array
jsoItem := TJsonObject.Create();
//add object pairs
jsoItem.AddPair(TJsonPair.Create('DT_RowId',TJsonString.Create(ds.FieldByname('pront').AsString)));
jsoItem.AddPair(TJsonPair.Create('pront', TJsonString.Create(ds.FieldByname('pront').AsString)));
jsoItem.AddPair(TJsonPair.Create('nome', TJsonString.Create(ds.FieldByname('nome').AsString)));
jsoItem.AddPair(TJsonPair.Create('endereco', TJsonString.Create(ds.FieldByname('endereco').AsString)));
jsoItem.AddPair(TJsonPair.Create('bairro', TJsonString.Create(ds.FieldByname('bairro').AsString)));
jsoItem.AddPair(TJsonPair.Create('cidade', TJsonString.Create(ds.FieldByname('cidade').AsString)));
jsoItem.AddPair(TJsonPair.Create('estado', TJsonString.Create(ds.FieldByname('estado').AsString)));
jsoItem.AddPair(TJsonPair.Create('telefone', TJsonString.Create(ds.FieldByname('telres').AsString)));
jsoItem.AddPair(TJsonPair.Create('convenio', TJsonString.Create(ds.FieldByname('convenio').AsString)));
jsoItem.AddPair(TJsonPair.Create('cpf', TJsonString.Create(ds.FieldByname('cpf').AsString)));
jsoItem.AddPair(TJsonPair.Create('email', TJsonString.Create(ds.FieldByname('email').AsString)));
//put it into array
jsa.AddElement(jsoItem);
ds.Next;
end;
jsp := TJSONPair.Create('data', jsa);
jso.AddPair(jsp);
result:=jso;
end;
这是功能的结果:
{
"draw": 3,
"recordsTotal": 5303,
"recordsFiltered": 5303,
"data": [{
"DT_RowId": "2582",
"pront": "2582",
"nome": "XXXXX",
"endereco": "RUA TEODORO DA SILVA,333/103",
"bairro": "VILA ISABEL",
"cidade": "RIO DE JANEIRO",
"estado": "RJ",
"telefone": "3683*2690",
"convenio": "GOLDEN CROSS ( B)",
"cpf": "",
"email": ""
}, {
"DT_RowId": "2818",
"pront": "2818",
"nome": "YYYYY",
"endereco": "RUA PEREIRA NUNES , 395 AP 308",
"bairro": "VILA ISABEL",
"cidade": "RIO DE JANEIRO",
"estado": "RJ",
"telefone": "YYYYY",
"convenio": "UN",
"cpf": "216820707-00",
"email": ""
}, {
"DT_RowId": "1015",
"pront": "1015",
"nome": "YYYYYY",
"endereco": "rua francisca zieze, 192",
"bairro": "aboliçao",
"cidade": "RIO DE JANEIRO",
"estado": "RJ",
"telefone": "25945909",
"convenio": "UN",
"cpf": "71883592704",
"email": ""
}, {
"DT_RowId": "1701",
"pront": "1701",
"nome": "JJJJJJ",
"endereco": "AV 28 DE SETEMBRO 163 APT 704",
"bairro": "VILA ISABEL",
"cidade": "RIO DE JANEIRO",
"estado": "RJ",
"telefone": "2253-7625",
"convenio": "PETROBRAS DISTR\ ( R)",
"cpf": "",
"email": ""
}, {
"DT_RowId": "1076",
"pront": "1076",
"nome": "LLLLLLLL",
"endereco": "RUA ARISTIDES ,241/304",
"bairro": "MEIER",
"cidade": "RIO DE JANEIRO",
"estado": "RJ",
"telefone": "2501*6600",
"convenio": "CORREIOS",
"cpf": "",
"email": ""
}, {
"DT_RowId": "5959",
"pront": "5959",
"nome": "ZULEICA IIIII",
"endereco": "rua dos araujos 11a, bl 02 ap 301",
"bairro": "tijuca",
"cidade": "RIO DE JANEIRO",
"estado": "RJ",
"telefone": "2254-5682",
"convenio": "AMIL",
"cpf": "53150457734",
"email": ""
}, {
"DT_RowId": "5894",
"pront": "5894",
"nome": "ZULEICA AAAAA",
"endereco": "RUA PROF GABIZO,332/102",
"bairro": "TIJUCA",
"cidade": "RIO DE JANEIRO",
"estado": "RJ",
"telefone": "2568*9654",
"convenio": "UNIMED (SCOFANO)",
"cpf": "54016843715",
"email": ""
}, {
"DT_RowId": "4034",
"pront": "4034",
"nome": "ZILENE KAKAKA",
"endereco": "RUA AFONSO FERREIRA ,162",
"bairro": "ENGENHO DE DENTRO",
"cidade": "RIO DE JANEIRO",
"estado": "RJ",
"telefone": "2597*2352",
"convenio": "CORREIOS",
"cpf": "",
"email": ""
}, {
"DT_RowId": "5126",
"pront": "5126",
"nome": "ZILDA MAMAMA",
"endereco": "AV DOM HELDER CAMARA 1201",
"bairro": "BENFICA",
"cidade": "RIO DE JANEIRO",
"estado": "RJ",
"telefone": "7646-0691",
"convenio": "BRADESCO (B)",
"cpf": "",
"email": ""
}, {
"DT_RowId": "4497",
"pront": "4497",
"nome": "ZILDA LALALA",
"endereco": "RUA SABARRETO , 13 CASA",
"bairro": "FONSECA - NITEROI",
"cidade": "RIO DE JANEIRO",
"estado": "RJ",
"telefone": "2721-6646",
"convenio": "UNIMED (SCOFANO)",
"cpf": "",
"email": ""
}]
}
来自svn(您也可以在unicode字符串实现中找到,但我更愿意在这里给出ansiString作为参考)
// https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Values、\u变量、\u和\u文字
函数ALJavascriptEncode(const Src:AnsiString;const useNumericReference:boolean=True):AnsiString;
变量i,l:整数;
Buf,P:潘斯卡尔;
ch:整数;
开始
结果:='';
L:=长度(src);
如果L=0,则退出;
如果使用numerireference,那么GetMem(Buf,L*6)//是非常安全的
else GetMem(Buf,L*2);//为了安全起见
尝试
P:=Buf;
对于i:=低(Src)到高(Src)不开始
ch:=Ord(src[i]);
案例ch
8:开始//退格
如果使用数字参考,则开始
ALStrMove('\u0008',第6页);
公司(P,6),;
结束
否则开始
ALStrMove('\b',P,2);
公司(P,2),;
结束;
结束;
9:开始//选项卡
如果使用数字参考,则开始
ALStrMove('\u0009',第6页);
公司(P,6),;
结束
否则开始
ALStrMove('\t',P,2);
公司(P,2),;
结束;
结束;
10:开始//新线路
如果使用数字参考,则开始
ALStrMove('\u000A',P,6);
公司(P,6),;
结束
否则开始
ALStrMove('\n',P,2);
公司(P,2),;
结束;
结束;
11:开始//垂直选项卡
如果使用数字参考,则开始
ALStrMove('\u000B',P,6);
公司(P,6),;
结束
否则开始
ALStrMove('\v',P,2);
公司(P,2),;
结束;
结束;
12:开始//表单提要
如果使用数字参考,则开始
ALStrMove('\u000C',P,6);
公司(P,6),;
结束
否则开始
ALStrMove('\f',P,2);
公司(P,2),;
结束;
结束;
13:开始//回车
如果使用数字参考,则开始
ALStrMove('\u000D',第6页);
公司(P,6),;
结束
否则开始
ALStrMove('\r',P,2);
公司(P,2),;
结束;
结束;
34:开始//双引号
如果使用数字参考,则开始
ALStrMove('\u0022',P,6);
公司(P,6),;
结束
否则开始
ALStrMove(“\”,P,2);
公司(P,2),;
结束;
结束;
38:begin/&…我们需要对其进行编码,因为在javascript中,';或&;将转换为“和错误未终止字符串”
ALStrMove('\u0026',P,6);
公司(P,6),;
结束;
39:开始//撇号或单引号
如果使用数字参考,则开始
ALStrMove('\u0027',第6页);
公司(P,6),;
结束
否则开始
ALStrMove('\'',P,2);
公司(P,2),;
结束;
结束;
60:begin/<…主要是隐藏javascript中的所有标记。
// http://www.wwco.com/~wls/blog/2007/04/25/using-script-in-a-javascript-literal/
ALStrMove('\u003C',P,6);
公司(P,6),;
结束;
62:begin//>…主要是隐藏javascript中的所有HTML标记。
ALStrMove('\u003E',P,6);
公司(P,6),;
结束;
92:开始//反斜杠字符(\)。
如果使用数字参考,则开始
ALStrMove('\u005C',P,6);
公司(P,6),;
结束
否则开始
ALStrMove('\\',P,2);
公司(P,2),;
结束;
结束;
否则开始
P^:=AnsiChar(ch);
公司(P),;
结束;
结束;
结束;
设置字符串(结果,Buf,P-Buf);
最后
FreeMem(Buf);
结束;
结束;
您传递给JavaScript的数据是JSON。您使用什么将数据库数据转换为JSON?它需要转义斜杠字符,但在您的情况下不会这样做。您是手动转换数据吗?如果是,您应该使用JSON库。请按原意使用JSON库。您也可以在此处查看:@Remy我正在手动编码,因为我不想给我的应用程序增加Json库开销。这是一个Intraweb应用程序。我只是认为会有一个delphi函数来完成。我已经使用了Json delphi库,但在这种情况下,它超出了我的需要。@LuizAlves然后你必须手动检测并编码Json拥有的少数保留字符(双引号、正斜杠和一些控制字符)。请参见