Проблема с кодировкой при импорте из CSV
Есть CSV таблица со столбцами примерно такого вида: id;sku;Название;Категория.
Таблица сохранена в формате UTF-8.
Далее я пытаюсь сделать массив (название столбца => какое-то значение), вот код:
$f = fopen(public_path('/path/file.csv'), 'r');
$columns = fgetcsv($f, null, ';');
$test = [];
foreach($columns as $key => &$column)
{
$test[$column] = 0;
}
var_dump($test);
Получаю вот такой результат:
array(4) {
["id"] => int(0)
["sku"] => int(0)
["Название"] => int(0)
["Категория"] => int(0)
}
Вроде бы все получилось, но если обратиться к первому элементу по ключу $test['id'] (обращаю внимание, именно к первому), то получаю ошибку Undefined index: id. Далее я решил преобразовать массив в JSON и увидел такую картину:
{
"\ufeffid": 0,
"sku": 0,
"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435": 0,
"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f": 0
}
Если же использовать json_encode c опцией JSON_UNESCAPED_UNICODE, то все отображается нормально:
{
"id": 0,
"sku": 0,
"Название": 0,
"Категория": 0
}
Понятное дело, что в тут скорее всего дело в кодировке, но все равно не понимаю как исправить эту ситуацию. Почему только с первый элементом происходит такая беда, а остальные ключи записываются нормально? Буду очень признателен за ваши подсказки, ответы и примеры.
Ответы (1 шт):
Нашел ответ здесь, для решения этой проблемы нужно удалить BOM заголовок. Переписал свой код таким образом:
$f = fopen(public_path('/path/file.csv'), 'r');
$columns = fgetcsv($f, null, ';');
$tempZeroCol = trim(preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $this->columns[0]));
if(!empty($tempZeroCol)) {
$this->columns[0] = $tempZeroCol;
}
$test = [];
foreach($columns as $key => &$column)
{
$test[$column] = 0;
}
var_dump($test);