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


How to support non-standard characters in PHP SplFileObject reading a CSV

我有一个简短的脚本,读取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文件,显示ü成功,说明文件在服务器上是正确的。

谁能建议如何PHP成功地处理德国字符时解析CSV?

所示的代码本身应该可以工作。我想问题是由CSV文件的字符编码引起的,这似乎不是utf-8。您需要找出输入文件的编码是什么。

一旦您发现,您可以使用iconv命令将文件转换为utf-8。(在评论中,您告诉输入编码是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在执行命令之前创建并截断输出文件。