проблема с fgetcsv () и Unicode

у меня есть код. на localhost у меня нет проблем с чтением файла csv (с символами Unicode). но при закачке кода на хост ничего не выводится. Зачем? какое решение?

while (($data=fgetcsv($fin,5000,","))!==FALSE) 
{
 var_dump($data[0]);  //on host output is `string(0) ""` but on local i can see output
 var_dump($data[1]);  //$data[1] is integer and  i can see output
}

person user006779    schedule 28.05.2011    source источник
comment
ты можешь прочитать в файле? возможно, недостаточно прав для чтения файла   -  person tradyblix    schedule 28.05.2011
comment
сделайте попытку $ fin и сообщите нам результат   -  person Aaria Carter-Weir    schedule 28.05.2011
comment
Известны ошибки с fgetcsv () и символами, отличными от ASCII, особенно в начале значений без кавычек: stackoverflow.com/questions/2238971/   -  person eswald    schedule 27.01.2012


Ответы (3)


Примечание.

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

http://php.net/fgetcsv

Одно из возможных решений - использовать setlocale().

person timdream    schedule 28.05.2011

Одна из таких вещей - наличие метки порядка байтов UTF или BOM. Символ UTF-8 для метки порядка байтов - это U + FEFF, или, скорее, три байта - 0xef, 0xbb и 0xbf - которые находятся в начале текстового файла. Для UTF-16 он используется для указания порядка байтов. Для UTF-8 в этом нет необходимости.

Итак, вам нужно обнаружить три байта и удалить спецификацию. Ниже приведен упрощенный пример того, как обнаружить и удалить три байта.

$str = file_get_contents('file.utf8.csv');
$bom = pack("CCC", 0xef, 0xbb, 0xbf);
if (0 == strncmp($str, $bom, 3)) {
    echo "BOM detected - file is UTF-8\n";
    $str = substr($str, 3);
}

Это все

person Jaro    schedule 28.09.2012
comment
Сможет ли mb_detect_encoding это поймать? - person Bob Gregor; 28.01.2014

Я использовал iconv для кодирования Unicode, и в моей ситуации он работает почти идеально. Надеюсь, это поможет и кому-то другому.

$csvFile = fopen('file/path', "r");
fgetcsv($csvFile);
while(($row = fgetcsv($csvFile, 1000, ";")) !== FALSE){        
  for ($c=0; $c < count($row); $c++) {
    echo iconv( "Windows-1252", "UTF-8", $row[$c]);
  }
}
fclose($csvFile);
person dogan    schedule 22.12.2017