Я столкнулся с небольшой проблемой при разборе 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-строка выглядит правильно перед анализом.
Есть идеи?