【问题标题】:Unable to write on the first line of csv using php无法使用 php 在 csv 的第一行写入
【发布时间】: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 collat​​ion_connection='utf8_general_ci'");


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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这无济于事。如果我这样做,$BOM 在第二行,空行在第三行。但我需要在第一行使用 $BOM,在第二行使用空行。
    • @K.Hui 我同意。首先,您需要摆脱第一个空行。您可以通过删除 标记之外的任何空格/空行来尝试此操作。只有在你摆脱了第一个空行之后,你才应该使用我更新的代码。
    • 天哪。在我的 之前有一个空行。问题解决了。
    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    相关资源
    最近更新 更多