Adding BOM to CSV file using fputcsv

13,378

Thanks to Mark Baker for this answer:

I needed to use fwrite() to add the BOM, not fputcsv().

The working version looks like this:

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;
    } 
}

Thanks, Mark!

Share:
13,378
Chuck Le Butt
Author by

Chuck Le Butt

Hello.

Updated on June 09, 2022

Comments

  • Chuck Le Butt
    Chuck Le Butt almost 2 years

    I have a simple CSV file being generated that includes foreign characters. I've noted that if I don't include a Byte Order Mark that the foreign characters aren't appearing properly in Excel (but they appear fine when a BOM is present).

    How can I add a BOM to the beginning of the file when it's first created? I've tried the following and it's not working :-/

    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;
    }