В 99% случаев когда вы будете забирать данные из .csv файла где имеется записи на русском, вы получите знаки вопросиков
Для решение проблемы есть 2 способа, какой лучше выбирать вам
В коде на будут комментарии, по этому вам не составит труда разобраться, и так первый вариант, в нем мы меняем кодировку перед выводом:
1 2 3 4 5 6 7 8 9 |
$handle = fopen("test.csv", "r"); // открывает файл на чтение while (($data = fgetcsv($handle, 0, ";")) !== FALSE) { // получаем построчно в виде массива строку, не забывайте указать разделитель, он может быть отличаться от моего $arr[] = array_map(function($val) { // применяем array_map для обработки каждого элемента массива return iconv('CP1251', 'UTF-8', $val); // iconv меняет кодировку переданной строки }, $data); } fclose($handle); |
Второй вариант меняет кодировку всего содержимого файла, а уже потом парсит его:
1 2 3 4 5 6 7 8 9 |
$handle = fopen('php://memory', 'w+'); // создает ресурс в пямяти fwrite($handle, iconv('CP1251', 'UTF-8', file_get_contents('test.csv'))); // fwrite - записывает данные полученные из file_get_contents перед эти данным меняется кодировка с помощью iconv rewind($handle); // ставим указатель в начало файла while (($data = fgetcsv($handle, 0, ";")) !== FALSE) { // получаем построчно в виде массива строку, не забывайте указать разделитель, он может быть отличаться от моего $arr[] = $data; } fclose($handle); |
В итоге в переменно $arr будет массив вот такой структуры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
array(21) { [0]=> array(29) { [0]=> string(14) "portfolio_name" [1]=> string(8) "lot_name" } [1]=> array(29) { [0]=> string(18) "Портфель 1" [1]=> string(1) "lot_name1" } [2]=> array(29) { [0]=> string(18) "Портфель 2" [1]=> string(1) "lot_name2" } } |