Как указать кодировку при обработке файла csv в PHP? - PullRequest
2 голосов
/ 12 января 2010
<?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 или около того)

Ответы [ 3 ]

3 голосов
/ 12 января 2010

Попробуйте изменить локаль.

Как сказано ниже в примере из руководства , которое вы дали:

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

Предлагаемый подход по комментарию на той же странице :

setlocale(LC_ALL, 'ja_JP.UTF8'); // for japanese locale

С setlocale():

Названия локалей можно найти в RFC 1766 и ISO 639 . Разные системы имеют разные схемы именования для локалей. [& hellip;] В Windows setlocale(LC_ALL, '') устанавливает названия локалей из региональных / языковых настроек системы (доступны через панель управления).

0 голосов
/ 29 марта 2017

попробуйте это:

<?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>";
}
?>
0 голосов
/ 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);
}

Вот и все

...