PHP str_getcsv去除umlauts

7

在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字符串看起来正确。有什么想法吗?

1
无法复制。对我来说可行。http://codepad.viper-7.com/v6WIaT - Gordon
这是一个编码问题。我尝试直接在 PHP 文件中使用 UTF-8 编码将字符串放置,然后它起作用了。现在,在解析代码之前,我使用 $csvString = utf8_encode($csvString);,它像魔法一样正常工作了。 - Javaguru
1
我想,我应该确保所有表单数据都使用UTF-8进行编码,使用<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>元标记和适当的HTTP响应头。 - Javaguru
你也可以在HTML中设置表单接受字符集:accept-charset - hakre
在Windows上可以运行,但在Linux机器上出现了这个问题。 - Josef Sábl
2个回答

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库来提取数据。

0

我曾经遇到过类似的问题,数据来自于 Microsoft Excel 并保存为 CSV 格式(是的,在“另存为...”对话框的“Web选项”中选择了 UTF8 编码)。但是,似乎这并不是 str_getcsv 期望的相同 UTF8 编码。

现在我先通过 iconv 处理所有内容,然后它就可以正常工作了 - Excel 的 CSV 文件似乎有些问题:

iconv -f windows-1252 -t utf8 source.csv > output.csv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接