У меня есть простой сценарий, который принимает файл 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 равен, например, en_US.UTF-8, файлы в однобайтовой кодировке будут прочитаны этой функцией неправильно.
Кроме того, поскольку это всегда в начале строки, может ли быть, что это действительно проблема скрытого переноса строки? Вот здесь:
Примечание: Если PHP неправильно распознает окончания строк при чтении файлов на компьютере Macintosh или созданных им, включение опции конфигурации времени выполнения auto_detect_line_endings может помочь решить проблему.
Вы также можете попробовать сохранить файл с разными окончаниями строк.
Вы правильно устанавливаете локаль перед вызовом fgetcsv()
?
setlocale(LC_ALL, 'fr_FR.UTF-8');
В противном случае fgetcsv()
не является многобайтовым.
Убедитесь, что вы установили значение, которое отображается в списке доступных локалей. В linux (конечно, в debian) вы можете убедиться в этом, сделав
locale -a
Вы должны получить что-то вроде...
C
en_US.utf8
POSIX
Для поддержки UTF8 выберите кодировку с utf8 на конце. Если ваш ввод кодируется чем-то другим, вам нужно будет использовать соответствующую локаль - но сначала убедитесь, что ваша ОС поддерживает ее.
Если вы установите локаль, недоступную в вашей системе, это вам не поможет.
Для этого поведения был зарегистрирован отчет об ошибке , но очевидно, что не является ошибкой .