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 />";
}
}
Решение
Вы уже проверили Страница ручной работы на 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 для входного файла.