fgetcsv 不读取附件

fgetcsv not reading enclosures

我正在尝试使用 fgetcsv 读取 CSV 行。但是它似乎根本不关心外壳。

这是该行的样子:

Super Administrator,"ROLE_SUPER_ADMIN, ROLE_GROUP_GUEST, ROLE_GROUP_WRITER, ROLE_USER_WRITER, ROLE_USER_GUEST"

根据 CSV 标准,这是一个有效的行,它应该 return 以下以 " 作为附件,, 作为分隔符:

$l = fgetcsv($handle, 0, ',', '"');
array(
    [0] => 'Super Administrator',
    [1] => 'ROLE_SUPER_ADMIN, ROLE_GROUP_GUEST, ROLE_GROUP_WRITER, ROLE_USER_WRITER, ROLE_USER_GUEST',
);

然而这是我得到的:

$l = fgetcsv($handle, 0, ',', '"');
array(
    [0] => 'Super Administrator',
    [1] => '"ROLE_SUPER_ADMIN',
    [2] => ' ROLE_GROUP_GUEST',
    [3] => ' ROLE_GROUP_WRITER',
    [4] => ' ROLE_USER_WRITER',
    [5] => ' ROLE_USER_GUEST"',
);

是的,似乎 fgetcsv 完全忽略了封闭字符。我尝试使用 fgets 然后使用 str_getcsv 使其工作,但结果是相同的 - str_getcsv 最有可能被 fgetcsv 调用以进行 CSV 转换。

我想这可能是我正在使用的 PHP 版本中出现的某种回归错误,所以我将 php -v 命令的结果粘贴在这里:

me@linux:~/$ php -v
PHP 5.5.27-1+deb.sury.org~trusty+1 (cli) (built: Jul 15 2015 12:14:44) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

我相信这是我写这篇文章时 PHP5 的最新版本。虽然我怀疑这是某种 PHP 错误,但它也可能是某种 installation/configuration 问题,因此我发布这个问题的原因。

有人经历过吗? 解决此问题的最佳方法是什么?

编辑:
正如 Mark Ba​​ker 所指出的,PHP5.5.27-1 实际上是目前 PHP5.5 的最新版本。

编辑 2:
这是 bin2hex 函数的尝试,显示为 var_dump.

行读取 ",",","(2 个单元格,每个单元格仅包含一个逗号):0022002c0022002c0022002c0022000a.

使用 bin2hex('"') 结果只是 22.

str_getcsv 仍然给我这个错误。

好的,解决了。

这就是大家的疑惑:文件的编码被搞乱了。我不知道这是哪种编码,但每当我尝试打开 CSV 时,LibreOffice 都会向我推荐 Unicode。

我不得不用 nano 打开它们才意识到确实存在编码问题。 Gedit、vim 或我电脑上的任何其他工具都没有出现错误。使用 nano 打开时,在每隔一个字符之间插入一个 @ 符号,并且换行符读取不正确。

似乎 fgetcsv 不支持某些编码。为了解决这个问题,我从 nano 重新创建了文件(从另一个没有显示 @ 的工具复制粘贴)。