php - BOM 随机出现在 JSON 回复中

标签 php json curl byte-order-mark

我正在使用 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/

相关文章:

php - IIS 7.0 增加 URL 大小限制

php - Firebase token 验证

php - mysql时间类型显示12 :00 AM as default value

PHP 模块未显示在站点上,但已安装在服务器上。

ruby - 当我通过反引号 `curl <url>` 从 ruby​​ 调用它时 curl 不同的结果

python - 从 html &lt;script&gt; 中提取 JSON 对象

java - 在 Java 上获取 XML 或 Json 的代码

json - 未进行 SSL 连接尝试时,MongoDB 提示 SSL 握手

php - Paypal PHP API 集成

git - curl 总是在 63 个字符后截断用户名