我正在使用 JSON 和 cURL 在两个服务器之间实现通信。问题是,有时会在 JSON 回复中的左括号之前附加 BOM(字节顺序标记)。我设法对其进行了修剪并成功解析了 JSON 字符串,但考虑到 JSON 是由我自己的代码生成的,我不知道 BOM 从何而来。
我正在使用 json_encode() 来生成回复,并使用 header() + echo 来打印它,据我所知,json_decode() 不会生成任何 BOM。相应的 .php 文件以 UTF-8 编码,并且其中没有 BOM(根据 Notepad++)。除了 cURL,我还尝试使用 Chrome 和 python (urllib2) 执行请求。虽然 Chrome 根本不注册任何 BOM,但 python 通常会因此而无法解析传入的 JSON。
那么,使用 echo 是否有一些细微差别,以某种方式产生这样的结果?我应该从哪里开始寻找问题的根源以及可能的解决方案?
最佳答案
我遇到了同样的问题。我从 PHP 输出 json,页面顶部还包含其他类文件。这些文件不输出任何内容,但是当它们被包含时,我得到的字节顺序标记与我包含的文件一样多。因此,如果我有 4 个包含,我的 json 开头也有 4 个 BOM。
我确保 include 没有打印任何数据,并且在 PHP 标签之外没有杂散的回车符。我尝试了诸如“application-json”等 header ,但没有任何效果。
最后,我只是在 notepad++ 中打开每个 PHP 文件,转到“编码”并将其从 UTF-8 更改为 ANSI,然后保存。这就是让它工作所需的一切并返回有效的 json。我根本没有对 PHP 代码进行任何更改。
这个解决方案感觉还是不太理想。由于我们没有从这些包含的文件中输出任何内容,因此应该不会受到任何影响。
关于php - BOM 随机出现在 JSON 回复中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7512474/