PHP流式CSV始终添加UTF-8 BOM

PHP流式CSV始终添加UTF-8 BOM,php,apache,utf-8,csv,byte-order-mark,Php,Apache,Utf 8,Csv,Byte Order Mark,以下代码获取一个“报告行”作为数组,并使用fputcsv将其转换为CSV。一切都很好,除了一个事实:不管我使用什么字符集,它都会在文件的开头放一个UTF-8 bom表。这是非常烦人的,因为A)我指定了iso,B)我们有很多用户使用的工具将UTF-8 bom显示为垃圾字符 我甚至尝试将结果写入字符串,剥离UTF-8 BOM,然后将其回送出来,仍然可以得到它。问题是否可能存在于Apache中? 如果我将fopen更改为本地文件,它在没有UTF-8 BOM的情况下可以很好地写入 header("Con

以下代码获取一个“报告行”作为数组,并使用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;
标题(“内容类型:text/csv;字符集=iso-8859-1”);
标题(“缓存控制:无存储,无缓存”);
标题(“内容处置:附件;文件名=\”report.csv\”);
$outstream=fopen(“php://output“,‘w’”;
对于($i=0;$i<$report->rowCount;$i++){
fputcsv($outstream,$report->getTaxMatrixLineValues($i),',',',');
}
fclose(外流);
出口

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

我不知道这是否解决了您的问题,但是您是否尝试过使用打印和内爆函数来做同样的事情

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)));
}
标题(“内容类型:text/csv;字符集=iso-8859-1”);
标题(“缓存控制:无存储,无缓存”);
标题(“内容处置:附件;文件名=\”report.csv\”);
对于($i=0;$i<$report->rowCount;$i++){
打印(内爆(“,”,$report->getTaxMatrixLineValues($i));
}

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

首先,我的用户是税务人员,而不是技术人员。他们使用他们使用的东西,我无法改变这一点。其次,在这一点上,我只是想弄明白这一点,因为我整天都在与之斗争,为了我的生活,我无法弄明白。输出缓冲已启用,但php源代码文件在iso-8859-1中。当我禁用输出缓冲时,我会收到错误,即在我到达第一个头(..)时,头已经发送了;行,但我前面唯一要做的事情是require_once和session_startI禁用了输出缓冲,更改了一些代码,这样我就不会收到已发送的标题问题,而且我仍然会在流式输出上获得UTF-8 BOM数据。Chris,感谢您的帮助!我检查并确保我的项目中的每个文件都保存为ASCII问题似乎是,即使包含UTF-8 BOM数据的文件也会影响输出。在输出缓冲仍然启用,并且所有源代码文件都更改为ASCII的情况下,一切似乎都很顺利!是的。即使您的文本编辑器可能无法直观地呈现BOM,但它在那里,php肯定能看到。对于php,它基本上看起来像ï»?内爆不支持在中引用带逗号的字符串。fputscv支持。