Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将delphi字符串转义到JavaScript函数_Javascript_Delphi - Fatal编程技术网

将delphi字符串转义到JavaScript函数

将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

我需要将表数据库中的字段内容传递给网页中的JavaSricpt函数

当字符串中有反斜杠时,我发现一个错误:

{"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拥有的少数保留字符(双引号、正斜杠和一些控制字符)。请参见