Автор: Адам Хейм

Дата: 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.