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

У меня есть простой сценарий, который принимает файл 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 />";
        }

    }
11
задан Lightness Races with Monica 26 July 2011 в 15:49
поделиться

3 ответа

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

Вот, например:

Примечание: Эта функция учитывает настройки локали. Если LANG равен, например, en_US.UTF-8, файлы в однобайтовой кодировке будут прочитаны этой функцией неправильно.

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

Примечание: Если PHP неправильно распознает окончания строк при чтении файлов на компьютере Macintosh или созданных им, включение опции конфигурации времени выполнения auto_detect_line_endings может помочь решить проблему.

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

1
ответ дан 3 December 2019 в 09:20
поделиться

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

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

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

Убедитесь, что вы установили значение, которое отображается в списке доступных локалей. В linux (конечно, в debian) вы можете убедиться в этом, сделав

locale -a

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

C
en_US.utf8
POSIX

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

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

8
ответ дан 3 December 2019 в 09:20
поделиться

Для этого поведения был зарегистрирован отчет об ошибке , но очевидно, что не является ошибкой .

2
ответ дан 3 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: