在PHP中解析包含德语umlauts(-> ä,ö,ü,Ä,Ö,Ü)的CSV字符串时,我遇到了一个小问题。
假设以下是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
以下是用于解析字符串并创建包含来自csv-String的数据的数组的适当PHP代码:
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
)
)
请注意,第二个条目缺少Ö。只有当umlaut直接放置在列分隔符字符之后时才会发生这种情况。如果连续放置了多个umlaut,例如"ÖÖÖsterreich",则也会发生这种情况,即"sterreich"。CSV字符串使用HTML表单发送,因此内容会被URL编码。我使用的是带有UTF-8编码的Linux服务器,在解析之前,CSV字符串看起来正确。有什么想法吗?
accept-charset
。 - hakre