PHP str_getcsv удаляет умляуты

Я столкнулся с небольшой проблемой при синтаксическом разборе 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-строкой:

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 выглядит правильно перед синтаксическим анализом.

Есть идеи?

7
задан Javaguru 5 July 2011 в 07:24
поделиться