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 />"; } } в 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, например, en_US.UTF-8, файлы в однобайтовом кодировании неправильно считываются этой функцией.

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

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

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

Правильно ли fgetcsv() свой язык, прежде чем вызывать 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 для входного файла.