2012-11-26 30 views
0

我目前托管在Heroku上一个PHP Facebook应用程序,其中我使用卷曲,以获取有关从图形API用户的数据。不同的输出在不同的服务器

我有哪里传回的数据包含Unicode字符,在Heroku的系统上json_decode没有正确输出中的Unicode字符的问题。我本地系统上的输出(相同的代码)很好。

望着生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

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

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

在我的本地Apache的包膜,我用了AddDefaultCharset设置默认字符集设置为UTF-8,这将覆盖任何东西在你的HTML页面的元标记设置。

在Heroku上,AddDefaultCharset设置为关闭,这意味着字符集总是在你的HTML页面的元标记来确定。

我EPIC FAIL是,我不得不在元标记一个错字。这在我的本地env中没有看到,因为Apache设置优先,但在Heroku中看到,内容类型取决于元标记设置。

+1

是的,在大多数情况下,如果你看到'é'(或类似)你有UTF8字节被解释为ISO-8859-1/Windows的1252(错误的头,正确的字节)。如果你看到'''你有ISO-8859-1/Windows-1252字节被解释为UTF-8(右标题,错误字节) – Esailija

+0

@Garreth我正面临同样的问题。我发送一个JSON编码的二进制文件内容在发布请求到服务器,我使用json_decode()来解码它,并且输出包含这些垃圾字符。你能告诉我如何解决这个问题吗?在POST请求中设置哪些头部以避免这种情况? – anni

相关问题