проблема с fgetcsv () и Unicode - PullRequest
2 голосов
/ 28 мая 2011

У меня есть код.на локальном хосте у меня нет проблем с чтением 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
}

Ответы [ 3 ]

7 голосов
/ 28 мая 2011

Примечание:

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

http://php.net/fgetcsv

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

2 голосов
/ 28 сентября 2012

Одной из таких вещей является появление метки порядка байтов UTF или спецификации.Символом 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);
}

Вот и все

0 голосов
/ 22 декабря 2017

Я использовал 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);
...