如何在PHP SplFileObject中读取CSV时支持非标准字符

时间:2014-07-03 13:09:25

标签: php csv splfileobject

我有一个简短的脚本,可以读取如下所示的CSV文件:

$csv = new SplFileObject($pathToFile, 'r');

while (!$csv->eof() && ($row = $csv->fgetcsv()) && $row[0] !== null) {
    var_dump($row);
}

这样做没问题,除了它有一些非标准字符的问题。 CSV中有一些德语单词,我的具体问题是它与变音符号有困难。它输出的行类型的一个示例是:

array(5) {
    [0]=>
        string(6) "J¦rgen"
    [1]=>
        string(8) "Lastname"
    [2]=>
        string(14) "name@domain.de"
    [3]=>
        string(7) "Example"
    [4]=>
        string(7) "Example"
}

Jürgen中的ü被替换为 | 字符。

我之前尝试过以下代码:

mb_internal_encoding('UTF-8');

但它没有效果。

在Vi中打开csv文件会显示ü成功,因此服务器上的文件是正确的。

在解析CSV时,有没有人可以建议PHP如何成功处理德语字符?

1 个答案:

答案 0 :(得分:1)

显示的代码本身应该有效。我想问题是由CSV文件的字符编码引起的,这似乎不是utf-8。您需要找出输入文件的编码。

找到后,您可以使用utf-8命令将文件转换为iconv。 (在评论中,您说输入编码为iso-8859-1)。

示例:

iconv -f 'iso-8859-1' -t 'utf-8' input.csv > utf8.csv

注意!请永远不要尝试直接覆盖文件:

iconv -f 'iso-8859-1' -t 'utf-8' data.csv > data.csv

这将覆盖(截断)data.csv并导致完全数据丢失。这是因为shell在执行命令本身之前创建并截断输出文件。