Знак вопроса (�) в json файле, у первого элемента при конвертировании из csv в json PHP

Рейтинг: 0Ответов: 0Опубликовано: 02.07.2023

Всем привет.

Есть файл index.php , в котором реализована форма с загрузкой csv файла на сервер, далее этот файл считывается и формируется json.

При получении первой строки из csv файла и формирования ее в заголовок (массив), каждому первому элементу (name) добавляется знак вопроса � в json файле. То есть вывод выглядит следующим образом.

 {
  "promotions": {
    "main": [
      {
        "�name": "Мороженое"

Соответственно данный знак вопроса мешает для дальнейшей работы, необходимо его убрать. Прошу подсказать как решить данную проблему.

index.php

<form action="./script/saveFile.php" method="post" enctype="multipart/form-data">
    <label> Select Files: </label>
    <input type="file" name="fileUpload[]" multiple>
    <input type="submit" name="Submit" value="Upload">
</form>

<?php
header('Content-type: text/html; charset=utf-8');
setlocale(LC_ALL, 'ru_RU.UTF-8');

mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
mb_http_input('UTF-8');
mb_http_output('UTF-8');
mb_language('uni');

// создаем шаблон для json
$jsonObj = '{"promotions": {}}';
$jsonObj2 = trim(str_replace('\\', '', json_encode($jsonObj, JSON_UNESCAPED_UNICODE)), '"');
$jsonObj3 = json_decode($jsonObj2, true); // декодируем json в массив
?>

<?php
$fileCsv = file("./promotions/convert.csv", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // файл который будем читать
$fileJson = 'promotions.json'; // файл в который будем записывать json 
$headersFile = array_shift($fileCsv); // получаем первую строку с заголовками
$headersFile = str_getcsv($headersFile, ';'); // деламем массив из первой строки

foreach ($fileCsv as $line) {
    // добавляем значения в массив
    $jsonObj3["promotions"]["main"][] = array_combine( $headersFile, str_getcsv($line, ';'));
}

echo trim(str_replace('\\', '', json_encode($jsonObj3, JSON_UNESCAPED_UNICODE)), '"'); // выводим на экран json
$writeJson = trim(str_replace('\\', '', json_encode($jsonObj3, JSON_UNESCAPED_UNICODE)), '"'); // записываем в переменную и удаляем лишнием символы - ковычки в начале и в конце и обратные слэши


// $bom = pack('H*', 'EFBBBF');
// $str = preg_replace("/^$bom/", '', $writeJson);

file_put_contents($fileJson, $writeJson); // записываем в файл 
?>

saveFile.php - скрипт для загрузки файлов

<?php
 // Set Upload Path
 $target_dir = '../promotions/';
  
 if( isset($_FILES['fileUpload']['name'])) {
   $total_files = count($_FILES['fileUpload']['name']);

   for($key = 0; $key < $total_files; $key++) {

    // check extension for upload file
    $checkEsxtension = strtolower(pathinfo($_FILES['fileUpload']['name'][$key], PATHINFO_EXTENSION));
    if (in_array($checkEsxtension, array('jpg', 'jpeg', 'png', 'json', 'csv'))) {

    // Check if file is selected
     if(isset($_FILES['fileUpload']['name'][$key]) && $_FILES['fileUpload']['size'][$key] > 0) {
  
        $original_filename = $_FILES['fileUpload']['name'][$key];
        $target = $target_dir . basename($original_filename);
        $tmp  = $_FILES['fileUpload']['tmp_name'][$key];
        move_uploaded_file($tmp, $target);

        header("Location: ../index.php"); // redirect to index
      } else {
        echo 'Ошибка! Загрузки, пожалуйста попробуйте еще раз.';
      }
    } else {
        echo 'Ошибка! Выберите файлы с разрешением: jpg, jpeg, png, csv';
    }
   }
 }

Файл csv

исходный CSV файл

Результат json файла

Вывод json файла

P.S.

Я пробовал определять кодировку utf-8, удалять bom, но ничего не помогло. Заметил, что файл csv определяется в vsCode в формате utf-8 with BOM, если csv файл сохранить в vsCode просто как utf-8 то данный символ сразу же пропадает

Ответы

Ответов пока нет.