Автор: Адам Хейм
Дата: 12 января 2016 г.
Использование символов, отличных от ASCII, в CSV может быть проблемой. Excel и большинство программ для работы с электронными таблицами, по-видимому, испытывают наибольшие трудности. Часто они искажают символы, отличные от ASCII, а также добавляют новые строки в многострочные электронные таблицы, отличные от ASCII, которые обычно должны отображаться как одна ячейка.
К счастью, для этого есть однострочное исправление. Добавление метки порядка байтов (BOM) в качестве первых байтов вашего файла сообщит Excel, что следующий поток данных — это данные UTF-8. Если вы хотите узнать больше о метках порядка байтов, эта статья содержит хорошее объяснение того, что они собой представляют и почему они существуют.
Итак, как вы используете это? В PHP это можно легко добавить следующим образом:
fputs($file_handler, "\xEF\xBB\xBF");
Вот полный пример, использующий это:
header("Expires: 0"); header("Cache-Control: must-revalidate"); header("Pragma: public"); header("Content-Type: text/csv", true); header("Content-Disposition: attachment; filename=export.csv");
$out = fopen("php://output", "w"); fputs( $out, "\xEF\xBB\xBF" );
fputcsv($out, [ "Name", "Address", "Phone Number" ]);
foreach($rs as $record) { $row = [ $record["full_name"], $record["address"], $record["phone_number"] ];
fputcsv($out, $row); flush(); ob_flush(); }
fclose($out);
Как видите, это легко добавить в любое существующее приложение, чтобы оно работало со всеми символами, отличными от ASCII.