Php 为什么';t jQuery.parseJSON()在所有服务器上都能工作吗?

Php 为什么';t jQuery.parseJSON()在所有服务器上都能工作吗?,php,javascript,jquery,json,Php,Javascript,Jquery,Json,嘿,我有一个阿拉伯语联系人脚本,它使用Ajax在填写表单后从服务器检索响应 在某些apache服务器上,jQuery.parseJSON()抛出一个无效的json异常,该异常与它在其他服务器上完全解析的json相同。此异常仅在chrome和IE上引发 json内容使用php的json\u encode()函数进行编码。我尝试用json数据发送正确的头,并将unicode设置为utf-8,但没有帮助 这是我尝试解析的json响应之一(删除了if的第二部分,因为它很长): {“页面标题”:“\u06

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

在某些apache服务器上,
jQuery.parseJSON()
抛出一个
无效的json
异常,该异常与它在其他服务器上完全解析的json相同。此异常仅在chrome和IE上引发

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

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

{“页面标题”:“\u062e\u0637\u0623\u0639\u0646\u062f\u0627\u0644\u0625\u0631\u0633\u0627\u0644!”}

注意:此数据的这种语言是阿拉伯语,这就是为什么在使用php的
json\u encode()
解析后看起来像这样

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

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

工作示例

坏例子

更新:为了进一步澄清,我想指出,我设法通过使用旧的
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()
方法中的错误,以便我可以向他们报告

您应该尝试使用json2.js(已打开)

甚至连jQuery的创建者John Resig都说您应该:

强烈建议使用此版本的JSON.js。如果您仍在使用旧版本,请升级(毫无疑问,此版本比前一版本造成的问题更少)


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


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

发现了问题很难注意到,但我看到了那个开口支架的一些有趣之处。。。它附近似乎有几个小点。我使用这个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中会神秘地起作用(取决于您的操作方式)

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

步骤1:设置记事本++以默认情况下无BOM的UTF-8格式对文件进行编码。

步骤2:打开每个现有的PHP文件,更改编码设置,然后重新保存。

在这两个示例中,我都找不到eval或parseJSON。你能告诉我们JSON解析的位置吗?另外,chromiumI发布了另一个版本1.3.1,它使用
eval()
,您可以在这里看到它:(它位于namodg.main.js中的
send
方法下)。当
$时,将自动使用parseJSON。ajax
数据类型设置为
json
。验证码的答案位于使用密钥加密的隐藏字段中,因此根本不需要会话。服务器的响应头几乎相同,但有一个中断了
parseJSON
方法!感谢您指出这个解析器,但是为什么jQuery团队没有使用这个新的API而不是他们自己的API呢?我不知道它包含在哪个版本的jQuery中,但可能不是1.3.1,因为有一张票可以让它包含在1.3.2中。先生,我真是太感谢您了。由于BOM,我遇到了各种各样的问题,但是我总是确保我保存的文件没有BOM。发生的事情是,那个服务器坏了的家伙在更改配置文件后用错误的编码保存了文件。对于犯同样错误的用户,我仍然需要使用
eval()
fix,但至少我现在知道了问题的原因。:)