2011-09-22 39 views
3

我正在使用JSON和cURL在两台服务器之间实现通信。问题在于,有时候会有BOM(字节顺序标记),在JSON回复中的开头括号之前附加。我已经设法修剪它并成功解析了JSON字符串,但考虑到JSON是由我自己的代码生成的,我不知道该BOM来自哪里。我使用json_encode()生成回复和标题()+回声来打印它,只要我不能告诉,json_decode()不会产生任何物料清单。相应的.php文件以UTF-8编码,并且没有BOM(根据Notepad ++)。除了cURL之外,我还尝试使用Chrome和Python(urllib2)执行请求。尽管Chrome根本没有注册任何物料清单,但python经常无法解析传入的JSON。BOM在JSON回复中随机出现

那么,有没有在使用echo一些细微之处,不知何故会产生这样的结果?我应该从哪里开始寻找问题的根源以及可能的解决方案?

+0

您的JSON是否包含任何多字节字符?如果你没有明确地提出BOM,那么我可以想到的唯一原因就是如果PHP由于某种原因确定有必要在其中存在......此外,出于兴趣,什么是相关的PHP版本? – DaveRandom

+0

不,JSON回复根本不包含多字节字符。我正在使用PHP 5.3.8 – Xifax

+0

你是否在回声之前将JSON转储到文件中? – DaveRandom

回答

1

我有同样的问题。我从PHP输出json,并在页面顶部包含其他类文件。这些文件不会输出任何内容,但是当它们被包含时,我得到的字节顺序标记与我包含文件一样多。所以如果我有4个包含,我的JSON开始时也有4个BOM。

我确定包括没有打印任何数据,并有PHP的标签之外没有杂散回车。我尝试了诸如“application-json”等标题,但没有成功。

最后,我简单地在记事本++中打开每个PHP文件,进入“编码”并将其从UTF-8更改为ANSI,然后保存。这就是让它工作并返回有效的json所需的一切。我根本没有更改PHP的代码。

这个解决方案仍然感觉不够理想。由于我们不从这些包含的文件输出任何内容,因此不应该有任何影响。

+1

这就是PHP解释器的工作原理。任何不在'<?php'和'?>'内的内容都会逐字输出。 BOM正好在文件的开头(3个第一个字节),所以在'<?php'之前。这就是它出现的原因,尽管在这样的文件中没有其他输出。请记住,您始终可以使用PHP在您的源文件中查找BOM并将其删除;) – Mchl

+0

只需关闭PHP结束标记即可。这也可以防止“标题已发送”的问题。 – taco

+0

使用“没有BOM的UTF-8”可以为您提供更多更好的服务。你不希望你的源代码被编码在一个不起眼的ANSI代码页中,只是为了删除BOM。 –