【问题标题】:PHP Streaming CSV always adds UTF-8 BOMPHP Streaming CSV 总是添加 UTF-8 BOM
【发布时间】:2011-02-04 07:31:00
【问题描述】:

以下代码将“报告行”作为数组获取,并使用 fputcsv 将其转换为 CSV。一切都很好,除了不管我使用什么字符集,它都会在文件的开头放置一个 UTF-8 bom。这非常烦人,因为 A)我指定 iso 和 B)我们有很多用户使用将 UTF-8 bom 显示为垃圾字符的工具。

我什至尝试将结果写入字符串,剥离 UTF-8 BOM,然后将其回显并仍然得到它。问题可能出在 Apache 上吗? 如果我将 fopen 更改为本地文件,它会在没有 UTF-8 BOM 的情况下正常写入。

header("Content-type: text/csv; charset=iso-8859-1");
header("Cache-Control: no-store, no-cache");
header("Content-Disposition: attachment; filename=\"report.csv\"");

$outstream = fopen("php://output",'w');

for($i = 0; $i < $report->rowCount; $i++) {
    fputcsv($outstream, $report->getTaxMatrixLineValues($i), ',', '"');
}
fclose($outstream);

exit;

【问题讨论】:

  • 首先,我的用户是税务人员,而不是技术人员。他们使用他们使用的东西,我无法改变这一点。其次,在这一点上,我只是想弄清楚这一点,因为我整天都在与它斗争,而我一生都无法弄清楚。

标签: php apache utf-8 csv byte-order-mark


【解决方案1】:

我的猜测是你的 php 源代码文件有一个 BOM,并且你启用了 php 的输出缓冲。

【讨论】:

  • 已启用输出缓冲,但 php 源代码文件位于 iso-8859-1 中。当我禁用输出缓冲时,我收到错误消息,当我到达我的第一个标头(..)时标头已经发送;行,但我唯一要做的就是 require_once 和 session_start
  • 我禁用了输出缓冲,更改了一些代码,所以我不会收到已发送的标头问题,而且我仍然会在流输出中获得 UTF-8 BOM 数据。
  • 克里斯,感谢您的帮助!我检查并确保我的项目中的每个文件都保存为 ASCII。问题似乎在于,甚至包含具有 UTF-8 BOM 数据的文件也会感染输出。仍然启用输出缓冲,并且所有源代码文件都更改为 ASCII,一切似乎都很好!
  • 是的。即使您的文本编辑器可能无法直观地呈现 BOM,但它就在那里,并且 php 肯定会看到它。对于 php,它基本上看起来像 ,它与 hello 没有什么不同
【解决方案2】:

我不知道这是否能解决您的问题,但您是否尝试过使用 print 和 implode 函数来做同样的事情?

header("Content-type: text/csv; charset=iso-8859-1");
header("Cache-Control: no-store, no-cache");
header("Content-Disposition: attachment; filename=\"report.csv\"");

for($i = 0; $i < $report->rowCount; $i++) {
    print(implode(',',$report->getTaxMatrixLineValues($i)));
}

这没有经过测试,但很明显。

【讨论】:

  • implode 不支持在 in 中使用逗号引用字符串。fputscv 支持。
猜你喜欢
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2011-05-22
  • 2020-07-07
  • 2014-03-10
  • 2020-01-25
  • 2013-07-26
相关资源
最近更新 更多