Как указать кодировку при обработке csv-файла в PHP?

StackOverflow https://stackoverflow.com/questions/2048347

  •  20-09-2019
  •  | 
  •  

Вопрос

<?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>";
}
?>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top