我在PHP中解析包含德语变音符号( - >ä,ö,ü,Ä,Ö,Ü)的CSV-Strings时遇到了一些问题。
假设以下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-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”。 使用HTML表单发送csv-string,从而对内容进行URL编码。 我使用Linux服务器,使用utf-8编码,并且在解析之前csv-string看起来是正确的。
有什么想法吗?
答案 0 :(得分:6)
假设fgetcsv(http://php.net/manual/en/function.fgetcsv.php)与str_getcsv()类似,则引用手册页:
考虑区域设置 通过这个功能。如果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库这样的标准框架库来提取数据
答案 1 :(得分:0)
我在一些源自Microsoft Excel的数据中遇到了与ï字符类似的问题,保存为CSV(是的,在“另存为...”对话框的“Web选项”部分选择了UTF8编码)。而且,这似乎与str_getcsv
期望的UTF8编码不同。
我现在首先通过iconv
运行所有内容并且它运行正常 - Excel似乎有一个CSV文件的想法:
iconv -f windows-1252 -t utf8 source.csv > output.csv