@Dizzy221
PHP Программист

Как исправить кодировку в CSV?

Пишу в файл и отдаю на загрузку CSV таким способом:
$data = [
  'Товар 1;some;3',
  'Товар 2;anather;6',
  'Товар 3;test;9'
];

header('Content-Type: text/csv');
header('Content-disposition: attachment;filename=data.csv');
foreach ($data as $row) {
  echo $row, PHP_EOL;
}


На выходе получаю кракозябры в русс символах
Пробывал проходится функцией iconv( "utf-8", "windows-1251",$string);
Выводит русс символы, но теряется первый символ или искажается. "Ќабор" вместо "Набор"
  • Вопрос задан
  • 481 просмотр
Решения вопроса 2
irishmann
@irishmann
Научись пользоваться дебаггером
<?php
    $data = [
      'Товар 1;some;3',
      'Товар 2;anather;6',
      'Товар 3;test;9'
    ];

    header('Content-Type: text/csv');
    header('Content-disposition: attachment;filename=data.csv');
    foreach ($data as $row) {
      echo mb_convert_encoding($row, 'CP1251', mb_detect_encoding($row)), PHP_EOL;
    }

результат

5da8648b3468d260899213.png
Ответ написан
@Dizzy221 Автор вопроса
PHP Программист
Проблема в том что эксель криво работает на маке с csv, вот такое решение нашел, все заработало на ура.
header('Content-Encoding: UTF-8');
        header('Content-Type: text/csv; charset=utf-8' );
        header(sprintf( 'Content-Disposition: attachment; filename=data.csv' ) );
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');

        $df = fopen( 'php://output', 'w' );

        //This line is important:
        fputs( $df, "\xEF\xBB\xBF" ); // UTF-8 BOM !!!!!

        foreach ( $data as $row ) {
            fputcsv( $df, $row , ';');
        }
        fclose($df);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@NinjaNickName
Web разработчик
Попробуйте сохранить сам файл в кодировка UTF-8
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы