2015-10-21 4 views
2

Мне нужно создать csv через PHP в UTF16-LE для поддержки Excel (в Windows и Mac OS X). Как было предложено here, я использовал mb_convert_encoding и добавил спецификацию в начале файла, а затем sep=;, чтобы открыть его правильно в Excel.UTF16-LE с спецификацией, не распознающей sep в csv-файле

header('Content-Type: application/csv; charset=UTF-16LE'); 
header('Content-Disposition: attachment; filename=export.csv'); 
$output = fopen('php://output', 'w'); 
fputs($output, mb_convert_encoding("\xEF\xBB\xBF" . "sep=;\n" . implode($labels, ";") . "\n", 'UTF-16LE', 'UTF-8')); 
foreach($data as $data_line) { 
    fputs($output, mb_convert_encoding(implode($data_line, ";") . "\n", 'UTF-16LE', 'UTF-8')); 
} 

Кодировка символов в порядке, но когда я пытаюсь открыть его в OpenOffice вот что я получаю:

Open Office UTF16-LE

sep=;\n не признается - она ​​не должна быть первая строка. Я не думаю, что это вопрос BOM, потому что, когда я открываю его с шестнадцатеричным редактором это то, что я получаю:

UTF16-LE BOM

спецификации кажется правильным, так как это ÿþ, который является UTF16-LE BOM. Я попробовал с \r\n вместо \n после sep, не повезло.

+0

Является ли 'sep = [значение]' директивой, специфичной для OpenOffice? Кажется, я не могу найти ссылок на него. –

+0

Я не думаю, что это стандарт, поскольку я не могу найти его в спецификации CSV, но он использовался для Excel, чтобы заставить его использовать ';' как разделитель, а не таблицы (см. [This] (http: // superuser .com/questions/647948/space-or-tabs-as-separator-in-csv), например). Но Excel тоже не распознает, поэтому, возможно, я использую это неправильно. – vard

+0

Не должна ли строка 'sep =; \ n' также находиться в UTF-16LE? –

ответ

1

Я не могу быть уверен, что это причина ваших проблем, но очевидная проблема, которую я вижу, заключается в том, что вы не кодировали строку sep=;\n как UTF-16LE.

Чтобы это исправить, изменить первую строку fputs():

$bom = "\xEF\xBB\xBF"; 
$header = $bom . "sep=;\n" . implode($labels, ";") . "\n"; 
fputs($output, mb_convert_encoding($header, 'UTF-16LE', 'UTF-8')); 

(Строка \xEF\xBB\xBF является Unicode Byte Order Mark в кодировке UTF-8, он даст правильный BOM при преобразовании в UTF- 16.)

+0

А это был хороший улов, но, к сожалению, я получил тот же результат (используя спецификацию UTF-8 и обернул все с помощью 'mb_convert_encoding' - я обновил код вопроса, чтобы отразить это). – vard

Смежные вопросы