我使用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时,它开始在第二行写入。如何在文件的第一行开始写文件?
答案 0 :(得分:1)
根据我的经验,我告诉你第一个空行是因为php标签外面有一些被遗忘的空格/空行。
要在\ xEF行之后获得所需的空行,请尝试以下操作:
$output = fopen('php://output', 'w');
$BOM = "\xEF\xBB\xBF
";
$fwrite($output,$BOM)
此外,如果您的PHP脚本中包含文件,还要检查它们是否在php标记之外的空格/行。