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