Мне нужно создать 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 вот что я получаю:
sep=;\n
не признается - она не должна быть первая строка. Я не думаю, что это вопрос BOM, потому что, когда я открываю его с шестнадцатеричным редактором это то, что я получаю:
спецификации кажется правильным, так как это ÿþ
, который является UTF16-LE BOM. Я попробовал с \r\n
вместо \n
после sep, не повезло.
Является ли 'sep = [значение]' директивой, специфичной для OpenOffice? Кажется, я не могу найти ссылок на него. –
Я не думаю, что это стандарт, поскольку я не могу найти его в спецификации CSV, но он использовался для Excel, чтобы заставить его использовать ';' как разделитель, а не таблицы (см. [This] (http: // superuser .com/questions/647948/space-or-tabs-as-separator-in-csv), например). Но Excel тоже не распознает, поэтому, возможно, я использую это неправильно. – vard
Не должна ли строка 'sep =; \ n' также находиться в UTF-16LE? –