【问题标题】:BOM randomly appears in JSON replyBOM 随机出现在 JSON 回复中
【发布时间】:2011-09-22 09:24:09
【问题描述】:

我正在使用 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 是否有一些细微差别,会以某种方式产生这样的结果?我应该从哪里开始寻找问题的根源以及可能的解决方案?

【问题讨论】:

  • 您的 JSON 是否包含任何多字节字符?如果您没有明确地放一个 BOM,我能想到出现 BOM 的唯一原因是,如果 PHP 出于某种原因确定有必要存在一个 BOM……另外,出于兴趣,什么是/是相关的 PHP 版本?
  • 不,JSON 回复根本不包含多字节字符。我正在使用 PHP 5.3.8
  • 您是否在回显之前随时将 JSON 转储到文件中?
  • 此 BOM 源自您在打开 <?php 标记之前的一个 PHP 脚本。使用真正的文本编辑器,无法找到十六进制编辑器。
  • 不,我不会将 JSON 保存到文件中(因此,不会从任何文件中读取)。所以,如果我的任何项目文件(例如,根本没有)包含这个讨厌的 BOM,它有可能以某种方式影响了结果 JSON 回复?

标签: php json curl byte-order-mark


【解决方案1】:

我遇到了同样的问题。我正在从 PHP 输出 json,页面顶部还包含其他类文件。这些文件什么都不输出,但是当它们被包含时,我得到的字节顺序标记与包含文件一样多。因此,如果我有 4 个包含,我的 json 开头也有 4 个 BOM。

我确保包含没有打印任何数据,并且 PHP 标记之外没有杂散的回车。我尝试了诸如“application-json”之类的标头,但没有任何效果。

最后,我只是在 notepad++ 中打开了每个 PHP 文件,转到“编码”并将其从 UTF-8 更改为 ANSI,然后保存。这就是让它工作的全部内容并返回有效的 json。我根本没有对 PHP 进行任何代码更改。

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

【讨论】:

  • PHP 解释器就是这样工作的。任何不在<?php?> 中的内容都将逐字输出。 BOM 就在文件的开头(前 3 个字节),所以在 <?php 之前。这就是它出现的原因,即使在这样的文件中没有生成其他输出。请记住,您始终可以使用 PHP 在源文件中查找 BOM 并为您删除它;)
  • 去掉 PHP 结束标签。这也可以防止“标头已发送”问题。
  • 使用“无 BOM 的 UTF-8”将更好地为您服务很多。你不希望你的源代码被编码在一个不起眼的 ANSI 代码页中,只是为了删除 BOM。
猜你喜欢
  • 2020-08-08
  • 1970-01-01
  • 2018-05-31
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
相关资源
最近更新 更多