【发布时间】:2015-05-15 16:42:57
【问题描述】:
背景
我正在使用 php 编写一个包含中文字符的 csv 文件。但是,它们不能很好地显示。我发现问题是没有BOM的excel不读取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文件?
附言。我的中文数据来自 MySQL 并使用:
mysql_query("set names utf8"); mysql_query("设置 character_set_client='utf8'");
mysql_query("设置 character_set_results='utf8'");
mysql_query ("set collation_connection='utf8_general_ci'");
tl;dr 当我写 csv 时,它开始写在第二行。如何在文件的第一行开始写文件?
【问题讨论】:
标签: php csv utf-8 export-to-csv byte-order-mark