Javascript 检索包含转义(!)符号的XML时,jQuery`ajax`调用抛出错误
客户端脚本接收文本输入中的文本,将其“包装”到XML块中,并将其发送到将信息存储在MySQL数据库中的服务器 作为包装输入值之前的第一步,我对“&”字符进行如下转义:Javascript 检索包含转义(!)符号的XML时,jQuery`ajax`调用抛出错误,javascript,xml,ajax,Javascript,Xml,Ajax,客户端脚本接收文本输入中的文本,将其“包装”到XML块中,并将其发送到将信息存储在MySQL数据库中的服务器 作为包装输入值之前的第一步,我对“&”字符进行如下转义: var copyright = copyright.replace(/&/g,"&"); 使用jquery的ajax方法将生成的XML数据块发送到服务器: var copyright = copyright.replace(/&/g,"&"), xml = "<req
var copyright = copyright.replace(/&/g,"&");
使用jquery的ajax
方法将生成的XML数据块发送到服务器:
var copyright = copyright.replace(/&/g,"&"),
xml = "<request><session>"+session+"</session><space>"+space_id+"</space><view>"+view_id+"</view><copyright>"+copyright+"</copyright></request>",
url = "hidden URL";
$.ajax({
type: "POST",
url: url,
contentType: "text/xml; charset=UTF-8",
dataType: "xml;charset=UTF-8",
data: xml
});
如果在输入字段中键入了一个符号,然后保存了该符号,则在尝试加载显示先前保存的相同内容的页面时,ajax调用将中断并运行错误
事件处理程序,错误如下:
error: parsererror
Error: Invalid XML: <?xml version="1.0" encoding="UTF-8"?><response><target>
<target_id>2095466</target_id>
<plot>20029/13</plot>
<builder>Lemminkäinen</builder>
<housing_form>vm</housing_form>
<block_name></block_name>
<finnish_year>2013</finnish_year>
<target_name>As Oy Helsingin Saukonranta</target_name>
<target_address>Saukonpaadenranta 8</target_address>
<office_space></office_space>
<purpose></purpose>
<reservations></reservations>
<contacts></contacts>
<infoflag>2</infoflag>
<views>
<view>
<view_id>2095468</view_id>
<copyright>B&M</copyright>
</view>
</views>
</target>
<status>OK</status><errormsg></errormsg></response>
错误:parserror
错误:无效的XML:
2095466
20029/13
莱明克宁
虚拟机
2013
作为奥伊·赫尔辛金·索孔兰塔
魔芋属8
2.
2095468
B&M
好啊
我做错了什么?我是在错误地逃避角色,还是其他原因
这个问题似乎是重复的,但对我来说似乎不是这样,因为在存储之前,符号和字符已经转义了。我甚至尝试添加额外的(1,然后两个)
amp
s到转义字符串,但结果完全相同。问题在于builder
节点中Lemminkäinen
的字符,正如Shahid所指出的。当Lemminkäinen
文本被UTF-8解码时,a
将是两个字符UTF-8编码的一部分。因此UTF-8解码器将尝试解码äi
,这不是有效的字符序列。ä
的正确UTF-8编码字符是二进制的Ã
或0xC3、0xA4
。因此,完整的UTF-8编码文本应该是LemminkÕinen
当报告的XML数据保存在XML文件中,然后用web浏览器打开时,它将在所有主要的web浏览器上失败:Chrome(“编码错误”)、Firefox(“格式不正确”)、Safari(“编码错误”)、MSIE(“在文本内容中发现无效字符”)、Opera(“编码中的非法字节序列”)
由于XML数据来自服务器,因此发布生成器数据的脚本很可能没有指定UTF-8字符集(没有迹象表明提供的代码就是执行此操作的代码)。它可能是由旧脚本造成的,到目前为止,旧脚本已经修复,但损坏已经造成。i、 e:数据库中添加了不正确的数据格式。在服务器维护期间,手动输入数据库也是一个可能的原因。事实证明,问题实际上来自服务器(我没有访问权限),处理请求的脚本没有正确转义符号和字符,即使它们位于客户端。
Bellow是一个JavaScript函数,用于转义XML使用的所有(?)特殊字符,以防有人需要它:
function escapeXML(string){
var str = string;
str = str.replace(/\&/g,"&");
str = str.replace(/\>/g,">");
str = str.replace(/\</g,"<");
str = str.replace(/\"/g,""");
str = str.replace(/\'/g,"'");
return str;
}
函数escapeXML(字符串){
var-str=字符串;
str=str.replace(/\&/g,“&;”);
str=str.replace(/\>/g,“”);
str=str.replace(/\n不确定这是问题还是打字错误,但不应var-copyright=copyright.replace(/&/g,“&;”),
be-var-copyright=copyright.replace(/&/g),“&;”,`?不确定,但请尝试此var-copyright=copyright.replace(/&/g,“&;”)
您可能需要在Lemminkäinen
和其他非ASCII字符中转义ä
。请看,与replace
一起使用的regexp格式并不是问题的根源,这里是发送到服务器的XML块(在转义了符号和字符之后):{D7CEFA2E}20815612081563Kirsi Korhonen ja Mika Penttil A&T
。原始字符串为“[…]A&T”。特殊字符不会导致任何问题,仅当字符串包含符号和字符时,调用才会触发错误
事件处理程序。
function escapeXML(string){
var str = string;
str = str.replace(/\&/g,"&");
str = str.replace(/\>/g,">");
str = str.replace(/\</g,"<");
str = str.replace(/\"/g,""");
str = str.replace(/\'/g,"'");
return str;
}