Добавление спецификации в файл CSV с помощью fputcsv

У меня создается простой CSV-файл, содержащий иностранные символы. Я заметил, что если я не включаю метку порядка байтов, иностранные символы не отображаются должным образом в Excel (но они отображаются нормально, когда присутствует спецификация).

Как я могу добавить спецификацию в начало файла при его первом создании? Я пробовал следующее, и это не работает :-/

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

person Chuck Le Butt    schedule 05.09.2014    source источник
comment
fwrite() $BOM в файл сразу после вашего fopen() (хотя не очень хорошая идея в вашем приложении).... не используйте fputcsv(), чтобы попытаться написать это   -  person Mark Baker    schedule 05.09.2014
comment
@MarkBaker Если вы хотите включить это в ответ, я соглашусь. Это сработало. В противном случае я сделаю это позже. Дай мне знать.   -  person Chuck Le Butt    schedule 05.09.2014


Ответы (1)


Спасибо Марку Бейкеру за этот ответ:

Мне нужно было использовать fwrite() для добавления спецификации, а не 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;
    } 
}

Спасибо, Марк!

person Chuck Le Butt    schedule 08.09.2014