json_decode在不同服务器上的不同输出

时间:2012-11-26 14:28:12

标签: json unicode

我目前正在Heroku上托管一个PHP Facebook应用程序,我在其中使用cURL从Graph API获取有关用户的数据。

我遇到的问题是返回的数据包含unicode字符,因为Heroku系统上的json_decode没有正确输出unicode字符。我本地系统的输出(相同的代码)很好。

查看从Graph返回的原始JSON,我可以看到它包含unicode转义,例如

{"id":"100003517896374","name":"Sky\u00e9     Mont\u00e1na","first_name":"Sky\u00e9","last_name":"Mont\u00e1na","link":"http:\/\/www.facebook.com\/skye.montana.73","username":"skye.montana.73","gender":"female","locale":"en_US"}

在我的本地系统上,json_decode将其转换为以下对象:

stdClass Object ( [id] => 100003517896374 [name] => Skyé Montána [first_name] => Skyé [last_name] => Montána [link] => http://www.facebook.com/skye.montana.73 [username] => skye.montana.73 [gender] => female [locale] => en_US )

在Heroku系统上,它转换如下:

stdClass Object ( [id] => 100003517896374 [name] => Skyé Montána [first_name] => Skyé [last_name] => Montána [link] => http://www.facebook.com/skye.montana.73 [username] => skye.montana.73 [gender] => female [locale] => en_US ) 

我对json_decode的理解是它将识别并正确解释unicode。在这种情况下,在Heroku上,它似乎是识别unicode,但不能正确解释它。

我需要做一些PHP设置来解决这个问题吗?是否与magic_quotes有关?我已经将两台服务器设置为具有相同的magic_quotes选项(关闭),但它没有区别。

1 个答案:

答案 0 :(得分:1)

好的,像往常一样,在发布SO后5分钟我找到了答案。

Apache有一个AddDefaultCharset指令。这可以设置为Off,其中没有任何内容添加到响应头;在,将iso-8859-1作为内容类型添加到响应头中;或者特定字符集,其中该集合作为内容类型添加到响应头中。

在我的本地Apache环境中,我使用AddDefaultCharset将默认字符集设置为UTF-8,它将覆盖HTML页面的元标记中设置的任何内容。

在Heroku上,AddDefaultCharset设置为off,这意味着charset始终由HTML页面中的元标记确定。

我的EPIC失败是因为我在元标记中输入了一个拼写错误。这在我的本地环境中没有出现,因为Apache设置优先,但是在Heroku中可以看到,其中内容类型取决于元标记设置。