UTF16-LE с спецификацией, не распознающей sep в файле csv

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

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, вот что я получаю:

Открытый офис UTF16-LE

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

UTF16-LE BOM

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

2

Решение

Я не уверен, является ли это причиной ваших проблем, но очевидная проблема, которую я вижу, состоит в том, что вы не закодировали 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 в кодировке UTF-8; при преобразовании в UTF-16 будет получена правильная спецификация.)

1

Другие решения

Других решений пока нет …