无法使用 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。
背景
我正在使用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。