eXcNightRider
@eXcNightRider
FullStack Web Developer | DevOps

Как можно решить проблему с кодировкой CSV файла созданного с помощью fputcsv?

Начальные условия:
1. База данных в utf8_general_ci
2. Выполняется некоторый запрос, возвращается массив.
Если без обработки выгрузить данные в csv следующими командами:
$fp = fopen('/var/project/documents/file.csv', 'wb');
fputcsv($fp, $title, ';', '"');
            foreach($data as $res){
                fputcsv($fp, $res, ';', ' ');
            }
            fclose($fp);

enca вернёт мне следующее
$ enca -g file.csv
Universal transformation format 8 bits; UTF-8
Doubly-encoded to UTF-8 from CP1251


А вот если добавить следующую обработку:
foreach($data as $k => $rec){
                foreach($rec as $key => $value){
                  $data[$k][$key] = mb_convert_encoding($value, "Windows-1251", "UTF-8");
                }
            }

и снова экспортировать файл в csv enca вернёт следующий ответ:
7bit ASCII characters
либо
KOI8-R Cyrillic
Surrounded by/intermixed with non-text data

Файл должна принять 1С, что она собственно сделать не может.
enca должна возвращать MS-Windows code page 1251
Пытался модифицировать .htaccess чтобы подменить кодировку.
Файл отдаётся вот так:
header('Content-type: text/csv;');
            header("Content-Disposition: attachment;filename=file.csv'");
            header('Cache-Control: must-revalidate');
            header('Content-Length: ' . filesize($file));
        }
        readfile($file);

Пробовал настраивать их - файл всё равно отдаётся не так как нужно.
Что ещё можно делать?
  • Вопрос задан
  • 1307 просмотров
Решения вопроса 2
Stalker_RED
@Stalker_RED
До самого конца работайте с utf-8, и потом уже готовому файлу делайте mb_convert_encoding
Ответ написан
Комментировать
eXcNightRider
@eXcNightRider Автор вопроса
FullStack Web Developer | DevOps
$converted_file = iconv('utf-8','windows-1251',file_get_contents('/var/project/documents/' . $this->type . '/tmp_' . $file));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы