PHP str_getcsv удаляет умлауты - PullRequest
7 голосов
/ 05 июля 2011

Я столкнулся с небольшой проблемой при разборе CSV-строк, содержащих немецкие умлауты (-> ä, ö, ü, Ä, Ö, Ü) в PHP.

Предположим, что следующая входная строка csv:

w;x;y;z
48;OSL;Oslo Stock Exchange;B
49;OTB;Österreichische Termin- und Optionenbörse;C
50;VIE;Wiener Börse;D

И соответствующий код PHP, используемый для анализа строки и создания массива, который содержит данные из csv-String:

public static function parseCSV($csvString) {
    $rows = str_getcsv($csvString, "\n");
    // Remove headers ..
    $header = array_shift($rows);
    $cols = str_getcsv($header, ';');
    if(!$cols || count($cols)!=4) {
        return null;
    }
    // Parse rows ..
    $data = array();
    foreach($rows as $row) {
        $cols = str_getcsv($row, ';');
        $data[] = array('w'=>$cols[0], 'x'=>$cols[1], 'y'=>$cols[2], 'z'=>$cols[3]);
    }
    if(count($data)>0) {
        return $data;
    }
    return null;
}

Результат вызова вышеуказанной функции с заданнымcsv-string приводит к:

Array
(
    [0] => Array
        (
            [w] => 48
            [x] => OSL
            [y] => Oslo Stock Exchange
            [z] => B
        )

    [1] => Array
        (
            [w] => 49
            [x] => OTB
            [y] => sterreichische Termin- und Optionenbörse
            [z] => C
        )

    [2] => Array
        (
            [w] => 50
            [x] => VIE
            [y] => Wiener Börse
            [z] => D
        )
)

Обратите внимание, что во второй записи отсутствует Ö.Это происходит только в том случае, если умлаут помещается непосредственно после символа-разделителя столбцов.Это также случается, если несколько последовательностей умлаут, то есть "ÖÖÖsterreich" -> "sterreich".Строка csv отправляется с использованием HTML-формы, поэтому содержимое получает URL-кодировку.Я использую сервер Linux с кодировкой utf-8, и csv-строка выглядит правильно перед анализом.

Есть идеи?

Ответы [ 2 ]

6 голосов
/ 07 июля 2011

Предполагая, что fgetcsv (http://php.net/manual/en/function.fgetcsv.php) работает аналогично str_getcsv (), затем цитирует man-страницу:

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

, тогда вам следует попробовать установить локаль с помощью setlocale http://php.net/manual/en/function.setlocale.php

, если это не работаетпопробуйте включить многобайтовую перегрузку http://www.php.net/manual/en/mbstring.overload.php

или даже лучше, используя стандартную библиотеку фреймворков, например библиотеку Zend / Symfony, для извлечения данных

0 голосов
/ 06 сентября 2016

У меня была похожая проблема с символом «ï» в некоторых данных, исходящих из Microsoft Excel, сохраненных как CSV (да, с кодировкой UTF8, выбранной в части «веб-параметров» диалога «Сохранить как ...»)).И все же, похоже, что это не та кодировка UTF8, которую ожидает str_getcsv.

Сначала я все провожу через iconv и все работает нормально - кажется, что-то не так с идеей Excel о CSV-файле:

iconv -f windows-1252 -t utf8 source.csv > output.csv
...