Как поддерживать нестандартные символы в PHP SplFileObject для чтения CSV

У меня есть короткий скрипт, который читает файл CSV, который выглядит следующим образом:

$csv = new SplFileObject($pathToFile, 'r');

while (!$csv->eof() && ($row = $csv->fgetcsv()) && $row[0] !== null) {
    var_dump($row);
}

Это работает нормально, за исключением проблемы с некоторыми нестандартными символами. В CSV есть несколько немецких слов, и моя конкретная проблема в том, что у него есть трудности с умлаутами. Пример типа строки, которую он выводит:

array(5) {
    [0]=>
        string(6) "J¦rgen"
    [1]=>
        string(8) "Lastname"
    [2]=>
        string(14) "name@domain.de"
    [3]=>
        string(7) "Example"
    [4]=>
        string(7) "Example"
}

Символ ü в Юргене заменяется символом ¦.

Я пытался поставить следующий код раньше:

mb_internal_encoding('UTF-8');

но это не имело никакого эффекта.

Открытие CSV-файла в Vi показывает успешно, поэтому файл является правильным на сервере.

Кто-нибудь может посоветовать, как PHP успешно обрабатывает немецкие символы при разборе CSV?

1 ответ

Решение

Сам код, как показано, должен работать. Я думаю, что проблема вызвана кодировкой символов файла CSV, который, кажется, не utf-8, Вам необходимо выяснить, какова кодировка вашего входного файла.

Как только вы узнали это, вы можете преобразовать файл в utf-8 с использованием iconv команда. (В комментариях вы сказали, что входная кодировка была iso-8859-1).

Пример:

iconv -f 'iso-8859-1' -t 'utf-8' input.csv > utf8.csv

Внимание! пожалуйста, никогда не пытайтесь переопределить файл прямо так:

iconv -f 'iso-8859-1' -t 'utf-8' data.csv > data.csv

Это перезапишет (урезает) data.csv и приведет к полной потере данных. Это связано с тем, что оболочка создает и усекает выходной файл перед выполнением самой команды.

Другие вопросы по тегам