无法使用 php 在 csv 的第一行写入

Unable to write on the first line of csv using php

背景

我正在使用php写一个包含中文字符的csv文件。但是,它们不能很好地显示。我发现问题是 excel 不读取没有 BOM 的 utf8。我需要在第一行添加 BOM,如果我使用 Notepad++ 将 \xEF\xBB\xBF 放在第一行,它就可以工作。

但是输出csv的应用是给用户的。我不能告诉用户自己做这件事,所以我必须通过 PHP.

来做

问题

这是我用来编写 bom 标签的代码。

<?php
 header('Content-Description: File Transfer');
 header('Content-Type: application/octet-stream'); 
 header('Content-Disposition: attachment; filename=file.csv');
 header('Content-Transfer-Encoding: binary');
 header('Expires: 0');
 header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
 header('Pragma: public');
 $output = fopen('php://output', 'w');
 $BOM = "\xEF\xBB\xBF";
 $fwrite($output,$BOM)
?>

这是我预期的结果
+----------------+
|\xEF\xBB\xBF|
|-----空行|
|----我的内容|
|----我的内容|
+----------------+
然而,结果是
+----------------+
|-----空行|
|\xEF\xBB\xBF|
|----我的内容|
|----我的内容|
+----------------+
我试过fwrite、fputs、fputcsv还是不能把BOM标签放在第一行
有没有办法放在第一行
或者有没有其他方法可以写一个excel可读的csv文件直接打开?


p.s。我的中文数据来自MySQL并使用:
mysql_query("set names utf8"); mysql_query("set character_set_client='utf8'"); mysql_query("set character_set_results='utf8'"); mysql_query ("set collation_connection='utf8_general_ci'");


tl;dr 当我写 csv 时,它开始写在第二行。如何在文件的第一行开始写文件?

根据我的经验,我告诉你第一个空行是因为 php 标签外的一些被遗忘的 space/empty 行。

要在 \xEF 行之后获得所需的空行,试试这个:

$output = fopen('php://output', 'w');
 $BOM = "\xEF\xBB\xBF
";
 $fwrite($output,$BOM)

此外,如果您的 php 脚本中包含文件,还要检查它们在 php 标签外是否为空 spaces/lines。