Мне нужно создать 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, вот что я получаю:
sep=;\n
не распознается — не должно быть на первой строке. Я не думаю, что это проблема спецификации, потому что, когда я открываю ее с помощью шестнадцатеричного редактора, это то, что я получаю:
Спецификация кажется правильной, так как ÿþ
которая является UTF16-LE BOM. Я пробовал с \r\n
на месте \n
после сентября без удачи.
Я не уверен, является ли это причиной ваших проблем, но очевидная проблема, которую я вижу, состоит в том, что вы не закодировали 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 будет получена правильная спецификация.)
Других решений пока нет …