将 BOM 添加到 PHP 输出流

Adding BOM to PHP output stream

我想将一些带有井号的数据导出到 CSV 文件,并添加 BOM 以正确表示井号。当我写入 php 输出流 php://output 时,我遇到了 BOM 在某处被忽略的情况,因此在文件中没有这 3 个字节。有趣的是,如果您复制 BOM 字符串(类似于 \xef\xbb\xbf\xef\xbb\xbf),前 3 个字节将被忽略,并且在文件中将只有最后 3 个字节。 这只是为了在输出流中写入而复制。当我尝试在真实文件中写入时,一切都按预期工作。

编辑: 澄清我的问题。也许有人知道为什么它如此有效?以及如何在不使用重复 BOM 字符串

等技巧的情况下解决问题

编辑: 我正在使用 Symfony 2.8 StreamedResponse。所以代码的工作方式为

$f = fopen('php://output', 'r+');
fwrite($f, "\xef\xbb\xbf\xef\xbb\xbf"); // only 3 bytes will exists
// other code. fputcsv(...) .. fflush($f)

我正在检查的文件 https://hexed.it/

似乎这就是 UTF-8 解码算法在浏览器中的工作方式,参见