Как указать кодировку при обработке csv-файла в PHP?
Вопрос
<?php
$row = 1;
$handle = fopen ("test.csv","r");
while ($data = fgetcsv ($handle, 1000, ",")) {
$num = count ($data);
print "<p> $num fields in line $row: <br>\n";
$row++;
for ($c=0; $c < $num; $c++) {
print $data[$c] . "<br>\n";
}
}
fclose ($handle);
?>
Приведенное выше взято из руководства по php, но я не видел, где указать кодировку (например, utf8 или около того)
Решение
Попробуйте изменить локаль.
Как сказано ниже в примере в руководство пользователя ты дал:
Примечание:Эта функция учитывает настройки локали.Если LANG - это, например,en_US.UTF-8, файлы в однобайтовой кодировке неправильно считываются этой функцией.
Предлагаемый подход в комментарии на той же странице:
setlocale(LC_ALL, 'ja_JP.UTF8'); // for japanese locale
От setlocale()
:
Названия языковых стандартов можно найти в RFC 1766 и ISO 639.Разные системы имеют разные схемы именования для локалей.[...] В Windows,
setlocale(LC_ALL, '')
устанавливает названия локалей из системных региональных / языковых настроек (доступны через панель управления).
Другие советы
Одной из таких вещей является появление метки порядка байтов 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);
}
Вот и все
попробуй это:
<?php
$handle = fopen ("specialchars.csv","r");
echo '<table border="1"><tr><td>First name</td><td>Last name</td></tr><tr>';
while ($data = fgetcsv ($handle, 1000, ";")) {
$data = array_map("utf8_encode", $data); //added
$num = count ($data);
for ($c=0; $c < $num; $c++) {
// output data
echo "<td>$data[$c]</td>";
}
echo "</tr><tr>";
}
?>