Как поддерживать нестандартные символы в 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 и приведет к полной потере данных. Это связано с тем, что оболочка создает и усекает выходной файл перед выполнением самой команды.