为什么jQuery.parseJSON()不适用于所有服务器?

嘿那里,我有一个阿拉伯语联系脚本,它使用Ajax在填写表单后从服务器检索响应。

在一些apache服务器上, jQuery.parseJSON()会抛出一个invalid json excepion,它会在其他服务器上完全解析相同的json。 仅在chrome和IE上抛出此exception。

json内容使用php的json_encode()函数进行编码。 我尝试使用json数据发送正确的标头并将unicode设置为utf-8,但这没有帮助。

这是我尝试解析的json响应之一(删除了if的第二部分,因为它很长):

{"pageTitle":"\u062e\u0637\u0623 \u0639\u0646\u062f \u0627\u0644\u0625\u0631\u0633\u0627\u0644 !"}

注意 :这个数据的语言是阿拉伯语,这就是为什么它在用php的json_encode()解析后看起来像这样。

您可以尝试在给出的示例中发出请求,并使用firebug或webkit开发人员工具查看完整的响应数据。 响应通过jsonlint !

最后,我有两个使用相同版本脚本的URL,尝试使用chrome或IE浏览它们以查看损坏示例中的错误。

工作示例 : http : //namodg.com/n/

破碎的例子 : http : //www.mt-is.co.cc/my/call-me/

更新:为了澄清更多,我想请注意,我通过使用旧的eval()解析内容来修复此问题,我发布了另一个版本,使用此修复程序,它是这样的:

 // Parse the JSON data try { // Use jquery's default parser data = $.parseJSON(data); } catch(e) { /* * Fix a bug where strange unicode chars in the json data makes the jQuery * parseJSON() throw an error (only on some servers), by using the old eval() - slower though! */ data = eval( "(" + data + ")" ); } 

我仍然想知道这是否是jquery的parseJSON()方法中的错误,以便我可以向他们报告。

发现问题了! 很难注意到,但是我看到那个开口支架的一些有趣的东西 ……它附近似乎有几个小点。 我使用这个JavaScript书签来找出它是什么:

 javascript:window.location='http://www.google.com/search?q=u+'+('000'+prompt('String?').charCodeAt(prompt('Index?')).toString(16)).slice(-4) 

我得到了结果页面 。 猜猜问题是什么! 在输出的开头有一个看不见的字符,实际上重复了两次。 零宽度非中断空间也称为Unicode字节顺序标记(BOM) 。 这就是为什么jQuery拒绝你原本有效的JSON以及为什么将JSON粘贴到JSONLint中的原因是神秘的(取决于你是怎么做的)。

将这种不需要的字符输入输出的一种方法是使用Windows记事本以UTF-8模式保存PHP文件! 如果这是您正在做的,请获取另一个文本编辑器,如Notepad ++ 。 重新保存所有PHP文件而不使用BOM来解决您的问题。

步骤1:默认情况下,设置Notepad ++以UTF-8编码文件而不使用BOM。 “首选项”的“新建文档”选项卡中没有BOM设置的UTF-8

步骤2:打开每个现有的PHP文件,更改编码设置,然后重新保存。 编码...在没有BOM的情况下以UTF-8编码

你应该尝试使用json2.js(它在https://github.com/douglascrockford/JSON-js上 )

甚至John Resig(jQuery的创建者)也说你应该:

强烈建议使用此版本的JSON.js. 如果你还在使用旧版本,请升级(这个,毫无疑问,比前一个问题少)。

http://ejohn.org/blog/the-state-of-json/

我没有看到任何与parseJSON()相关的内容

我看到的唯一区别是在工作示例中设置了session-cookie(猜测它是“captcha”,数学计算所需),在另一个例子中没有设置session-cookie。 因此,如果没有session-cookie,计算结果的比较可能会失败。