PHP fputcsv encoding
Default encoding for an excel file is machine specific ANSI, mainly windows1252 . But since you are creating that file and maybe inserting UTF-8 characters, that file is not going to be handled ok.
You could use iconv() when creating the file. Eg:
It’s Working: Enjoy
use this before fputcsv:
$line = array_map("utf8_decode", $line);
@ragol utf8_decode: Converts a string with ISO-8859-1 characters encoded with UTF-8 to single-byte ISO-8859-1. that resolves the issue. Please check typeerror.org/docs/php/function.utf8-decode
@ArslanTabassum The question was about Windows1251 encoding, not ISO-8859-1. They are different. utf8_decode and utf8_encode functions only work with ISO-8859-1. Using them for anything else is wrong. That is also stated as a note in the documentation. Also this function is deprecated in the upcoming PHP 8.2.0.
The file will be in whatever encoding your strings are in. PHP strings are raw byte arrays, their encodings depends on wherever the bytes came from. If you just read them from your source code files, they’re in whatever you saved your source code as. If they’re from a database, they’re in whatever encoding the database connection was set to.
If you need to convert from one encoding to another, use iconv . If you need more in-depth information, see here:
What if I choose an encoding where the , and » used in the CSV files are encoded differently, like UTF-16?
Then supply UTF-16 encoded » and , to fputcsv as parameters. (Haven’t actually tried it though, but would be my first attempt.)
PHP fputcsv кодировка
Кодировка по умолчанию для файла excel относится к конкретному аппарату ANSI, в основном windows1252 . Но так как вы создаете этот файл и, возможно, вставляете символы UTF-8, этот файл не будет обрабатываться нормально. Вы можете использовать iconv() при создании файла. Например:
Когда я использую этот метод, у меня появляется эта ошибка: iconv (): обнаружен недопустимый символ во входной строке
Msgstr «Кодировка по умолчанию для файла csv — windows1251» . Кто установил это значение по умолчанию?
Это Работа: Наслаждайтесь используйте это перед fputcsv:
$line = array_map("utf8_decode", $line);
Файл будет находиться в любой кодировке, в которой находятся ваши строки. Строки PHP представляют собой массивы необработанных байтов, их кодировки зависят от того, откуда взялись байты. Если вы просто прочитали их из файлов исходного кода, они находятся в том, что вы сохранили исходный код. Если они из базы данных, они находятся в любой кодировке, установленной для подключения к базе данных.
Если вам нужно конвертировать из одной кодировки в другую, используйте iconv . Если вам нужна более подробная информация, см. Здесь:
Что делать , если я выбираю кодировку , где , и » , используемый в файлах CSV кодируются по- разному, как UTF-16?
Затем fputcsv качестве параметров кодировку UTF-16 » и , для fputcsv (хотя на самом деле я не пробовал, но это будет моя первая попытка.)
Чтобы преобразовать элементы массива, вы переходите к функции fputcsv к нужной кодировке.
PHP массив в файл CSV
Пример как преобразовать массив в CSV и сохранить его диске или отдать на скачивание. Имеем массив $prods :
$prods = array( array( 'id' => '697', 'name' => 'Динамический ортез-стоподержатель', 'category' => 'Ортезы', 'price' => '35990 RUB', ), array( 'id' => '698', 'name' => 'Бандаж на коленный сустав', 'category' => 'Ортезы', 'price' => '3610 RUB', ), array( 'id' => '699', 'name' => 'Бандаж на плечевой сустав', 'category' => 'Ортезы', 'price' => '3700 RUB', ), );
// Подключение к БД. $dbh = new PDO('mysql:dbname=НАЗВАНИЕ_БД;host=localhost', 'ЛОГИН', 'ПАРОЛЬ'); $sth = $dbh->prepare("SELECT * FROM `prods`"); $sth->execute(); $array = $sth->fetch(PDO::FETCH_ASSOC); $prods = array(); foreach($array as $row) < $prods[] = array( 'id' =>$row['id'], 'name' => $row['name'], 'category' => $row['category'], 'price' => $row['price'], ); >
Отдача файла на скачивание
header("Content-type: text/csv"); header("Content-Disposition: attachment; filename=file.csv"); header("Pragma: no-cache"); header("Expires: 0"); $buffer = fopen('php://output', 'w'); fputs($buffer, chr(0xEF) . chr(0xBB) . chr(0xBF)); foreach($prods as $val) < fputcsv($buffer, $val, ';'); >fclose($buffer); exit();
Сохранение файла на сервере
$buffer = fopen(__DIR__ . '/file.csv', 'w'); fputs($buffer, chr(0xEF) . chr(0xBB) . chr(0xBF)); foreach($prods as $val) < fputcsv($buffer, $val, ';'); >fclose($buffer); exit();
Строка fputs($buffer, chr(0xEF) . chr(0xBB) . chr(0xBF)); добавляет в начало файла метку BOM, благодаря этому файл откроется в Excel с нормальной кодировкой.
Результат
697;"Динамический ортез-стоподержатель";Ортезы;"35990 RUB" 698;"Бандаж на коленный сустав";Ортезы;"3610 RUB" 699;"Бандаж на плечевой сустав";Ортезы;"3700 RUB"
Открытый в Excel
Экспорт таблицы в csv файл с помощью php
Есть скрипт php, который реализует экспорт таблицы в SCV файл.Когда открываешь,выдает непонятные символы.Скорее всего проблема в кодировке,но я целый день бьюсь головой об стену и все попытки тщетны. Сам скрипт:
$query = "SELECT id,producer,name,short,full,nval,price_v,price1_v,price2_v,price3_v FROM `ve_goods` WHERE producer='iptronic'"; $result = mysqli_query(DB::db(), $query); $number_of_fields = mysqli_num_fields($result); $headers = array(); for ($i = 0; $i < $number_of_fields; $i++) < $headers[] = mysqli_field_name($result, $i); >$fp = fopen('php://output', 'w'); if ($fp && $result) < header('Content-Type: text/csv; utf-8; windows-1251'); header('Content-Disposition: attachment; filename="export.csv"'); header('Pragma: no-cache'); header('Expires: 0'); fputcsv($fp, $headers); while ($row = $result->fetch_array(MYSQLI_NUM)) < fputcsv($fp, array_values($row)); >die; > function mysqli_field_name($result, $field_offset) < $properties = mysqli_fetch_field_direct($result, $field_offset); return is_object($properties) ? $properties->name : null; >
это файл в кодировке utf8 открытый как windows-1251 . При открытии CSV в эксель нужно выбрать правильную кодировку и разделитель.
Измените заголовок header(‘Content-Type: text/csv; utf-8; windows-1251’); на header(‘Content-Type: text/csv; charset=utf-8’);
да изначально ,код так и был написан header(‘Content-Type: text/csv; charset=utf-8’); это уже был мой эксперимент header(‘Content-Type: text/csv; utf-8; windows-1251’); В общем не так и не так не работает