Исправляем баг с кириллицей в функции fgetcsv
Многие сталкивались с проблемой парсинга кириллицы из файлов csv. В интернете советуют менять локаль, но такой способ не пришелся по нраву.
Была найдена вот такая переделанная функция, которая помогает решить поставленную задачу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | function fgetcsv2($f_handle, $length, $delimiter=';', $enclosure='"') { if (!strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') return fgetcsv($f_handle, $length, $delimiter, $enclosure); //если указатель на файл не задан, то возвращаем false if (!$f_handle || feof($f_handle)) return false; //если разделитель не задан, то возвращаем false if (strlen($delimiter) > 1) $delimiter = substr($delimiter, 0, 1); elseif (!strlen($delimiter)) return false; if (strlen($enclosure) > 1) // There _MAY_ be an enclosure $enclosure = substr($enclosure, 0, 1); $line = fgets($f_handle, $length); if (!$line) return false; $result = array(); $csv_fields = explode($delimiter, trim($line)); $csv_field_count = count($csv_fields); $encl_len = strlen($enclosure); for ($i = 0; $i < $csv_field_count; $i++) { if ($encl_len && $csv_fields[$i]{0} == $enclosure) $csv_fields[$i] = substr($csv_fields[$i], 1); if ($encl_len && $csv_fields[$i]{strlen($csv_fields[$i]) - 1} == $enclosure) $csv_fields[$i] = substr($csv_fields[$i], 0, strlen($csv_fields[$i]) - 1); $csv_fields[$i] = str_replace($enclosure . $enclosure, $enclosure, $csv_fields[$i]); $result[] = $csv_fields[$i]; } return $result; } |
Все параметры в точности копируются от fgetcsv, поэтому проблем с переделкой уже существующего кода не возникнет.