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

时间:2015-03-13 08:54:29

标签: php csv utf-8 export-to-csv byte-order-mark

背景

我使用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 collat​​ion_connection ='utf8_general_ci'”);


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

1 个答案:

答案 0 :(得分:1)

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

要在\ xEF行之后获得所需的空行,请尝试以下操作:

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

此外,如果您的PHP脚本中包含文件,还要检查它们是否在php标记之外的空格/行。