FGETCSV () игнорирует специальные символы, когда они в начале строки!

StackOverflow https://stackoverflow.com/questions/2238971

  •  19-09-2019
  •  | 
  •  

Вопрос

У меня есть простой скрипт, который принимает файл CSV и считывает каждую строку в массив. Затем я прокатился через каждый столбец первой строки (в моем случае в нем есть вопросы опроса) и распечатываю их. Опрос проходит на французском языке, и всякий раз, когда первый персонаж вопроса - это особый персонаж (é, ê, ç и т. Д.) Fgetcsv просто опускает его.

Специальные символы в середине значения не влияют только тогда, когда они являются первым персонажем.

Я пытался отладить это, но я сбит с толку. Я сделал var_dump с содержанием файла, и символы определенно есть:

var_dump(utf8_encode(file_get_contents($_FILES['csv_file']['tmp_name'])));

А вот мой код:

if(file_exists($_FILES['csv_file']['tmp_name']) && $csv = fopen($_FILES['csv_file']['tmp_name'], "r"))
    {
        $csv_arr = array();

        //Populate an array with all the cells of the CSV file
        while(!feof($csv))
        {
            $csv_arr[] = fgetcsv($csv);
        }

        //Close the file, no longer needed
        fclose($csv);

        // This should cycle through the cells of the first row (questions)
        foreach($csv_arr[0] as $question)
        {
            echo utf8_encode($question) . "<br />";
        }

    }
Это было полезно?

Решение

Вы уже проверили Страница ручной работы на FGETCSV? О этой конкретной проблеме ничего не говорит, но, возможно, ряд вкладов, возможно, стоит просмотреть, если здесь ничего не появится.

Например, есть это:

Примечание. Настройка локализации учитывается этой функцией. Если Lang EG EN_US.UTF-8, файлы в одном байтовом кодировании читаются неправильно этой функцией.

Кроме того, видя, что это всегда в начале линии, может ли это быть, что это действительно проблема скрытой линии? Есть это:

ПРИМЕЧАНИЕ. Если PHP неправильно распознает окончания строки при чтении файлов либо включенным, либо созданным компьютером Macintosh, позволяя опцию конфигурации времени выполнения AUTO_DETECT_LINE_NENDINGS может помочь решить проблему.

Вы также можете попробовать сохранить файл с разными концами строки.

Другие советы

Вы правильно устанавливаете локали перед вызовом fgetcsv()?

setlocale(LC_ALL, 'fr_FR.UTF-8');

В противном случае, fgetcsv() не является мульти-байтовым безопасным.

Убедитесь, что вы установили его на что -то, что появляется в вашем списке доступных локалов. На Linux (конечно, на Debian) вы можете увидеть это, делая

locale -a

Вы должны получить что -то вроде ...

C
en_US.utf8
POSIX

Для поддержки UTF8 выберите кодирование с UTF8 на конце. Если ваш ввод закодирован с чем -то еще, вам нужно использовать соответствующую локаль, но убедитесь, что ваша ОС поддерживает ее в первую очередь.

Если вы установите локаль в локаль, который недоступен в вашей системе, это вам не поможет.

Такое поведение имеет отчет об ошибке подано для этого, но, очевидно, это не ошибка.

Мы видели тот же результат с LANG установлен в C, и работал вокруг этого, гарантируя, что такие ценности были завернуты в кавычки. Например, линия

a,"a",é,"é",óú,"óú",ó&ú,"ó&ú"

генерирует следующий массив при прохождении fgetcsv():

array (
  0 => 'a',
  1 => 'a',
  2 => '',
  3 => 'é',
  4 => '',
  5 => 'óú',
  6 => '&ú',
  7 => 'ó&ú',
)

Конечно, вам придется избежать любых кавычек в ценности, удваивая их, но это гораздо меньше хлопот, чем ремонт пропавших персонажей.

Как ни странно, это происходит с кодировками UTF-8 и CP1252 для входного файла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top