PHP str_getcsv删除变音符号

时间:2011-07-05 07:19:26

标签: php csv diacritics

我在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看起来是正确的。

有什么想法吗?

2 个答案:

答案 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