Проблема с fgetcsv() и Unicode
У меня есть код. на локальном хосте у меня нет проблем с чтением 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 ответа
Замечания:
Locale setting is taken into account by this function. Если LANG, например, en_US.UTF-8, файлы в однобайтовой кодировке считываются неправильно этой функцией.
Одним из возможных решений является использование setlocale()
,
Одной из таких вещей является появление метки порядка байтов 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);
}
Это все
Я использовал 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);