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

3

我是一个有用的助手,可以为您进行文本翻译。

我有一个简短的脚本,读取一个看起来像下面这样的CSV文件:

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

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

这个功能还不错,但是它在处理一些非标准字符时会出现问题。CSV文件中有一些德语单词,我的具体问题是它对umlauts的处理有困难。它输出的一种类型的行如下:

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时成功地处理德语字符?


对我来说可以运行。假设您正在终端中执行它,那么您使用的终端编码是什么?尝试通过浏览器执行。 - hek2mgl
我之前是在命令行中运行它,但我进行了一些调整以便从浏览器中运行,结果出现了同样的问题。CSV文件中的值被放入MySQL数据库表中,但是其中的umlaut字符并没有被正确处理。(系统中其他使用HTTP POST方式获取数据而非CSV文件的PHP脚本可以成功处理umlaut字符并将其插入到MySQL中,没有出现问题。) - Jack
尝试使用iconv(在命令行上)将文件转换为utf-8。在此之前,您需要找出csv文件的输入编码方式。为此,您需要查看生成csv文件的程序。如果这是不可能的,我最好的猜测是windows-CP-1252。 - hek2mgl
我最初是通过PuTTY使用UTF-8运行这个程序的。 - Jack
你手动编写了CSV文件吗? - hek2mgl
显示剩余2条评论
1个回答

2

代码本身应该可以运行。我猜问题是由于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在执行命令本身之前就创建并截断了输出文件。

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