php - 使用 fputcsv 将 BOM 添加到 CSV 文件

标签 php excel csv byte-order-mark fputcsv

我生成了一个包含外来字符的简单 CSV 文件。我注意到,如果我不包含字节顺序标记,则外来字符无法在 Excel 中正确显示(但当存在 BOM 时它们显示正常)。

如何在首次创建文件时将 BOM 添加到文件的开头?我已经尝试了以下但它不起作用:-/

function processForm($competition, $competitionEntry) {
    $BOM = "\xEF\xBB\xBF"; // UTF-8 BOM

    $filename = $competition->ID.".csv";
    $file = "entries/".$filename;     

    $fields = array_keys($competitionEntry);
    $submittedForm = $competitionEntry;

    if(file_exists($file)) {
        $fp = fopen($file, 'a');
        if($fp && 
            fputcsv($fp, $submittedForm) && 
            fclose($fp)) {
            return true;
        } 
    } else { // CREATE NEW FILE
        $fp = fopen($file, 'w');
        if($fp && 
            fputcsv($fp, $BOM) && // WRITE BOM TO FILE   
            fputcsv($fp, $fields) &&
            fputcsv($fp, $submittedForm) &&
            fclose($fp)) {     
            return true;
        } 
    }
    return false;
}

最佳答案

感谢Mark Baker对于这个答案:

我需要使用 fwrite() 添加 BOM,而不是 fputcsv()。

工作版本如下所示:

if(file_exists($file)) {
    $fp = fopen($file, 'a');
    if($fp && 
        fputcsv($fp, $submittedForm) && 
        fclose($fp)) {
        return true;
    } 
} else {
    $fp = fopen($file, 'w');
    fwrite($fp, $BOM); // NEW LINE
    if($fp &&    
        fputcsv($fp, $fields) &&
        fputcsv($fp, $submittedForm) &&
        fclose($fp)) {     
        return true;
    } 
}

谢谢,马克!

关于php - 使用 fputcsv 将 BOM 添加到 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25686191/

相关文章:

excel - 如何枚举所有可以以纯文本形式打开 XML 文件的程序?

java - 如何使用 hadoop 按列读取 CSV 文件?

php - 如何构建包含文件夹结构的数组?

php - 用户认证 PHP/SQL

内容中的 PHP Linkify 链接

excel - 如何使用 VBA 遍历 Excel 中的可变列长范围

c# - 获取提升的excel进程

linux - 将大量文件夹中的 txt 和 csv 文件合并为一个大 csv 文件

java - 包含许多表的 CSV 文件

php - 使用 PHP 在 if 语句后启动函数时出错