【问题标题】:fgetcsv not reading enclosuresfgetcsv 不读取附件
【发布时间】:2015-10-29 20:31:59
【问题描述】:

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

下面是这条线的样子:

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

这是 CSV 标准的有效行,它应该返回以下内容,并以 " 作为附件,, 作为分隔符:

$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 似乎完全无视了外壳字符。我尝试使用fgetsstr_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 错误,但也可能是一些安装/配置问题,因此我发布此问题。

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

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

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

行读取",",","(2 个单元,每个单元中仅包含一个昏迷):0022002c0022002c0022002c0022000a

使用bin2hex('"'),结果就是22

str_getcsv 仍然给我这个错误。

【问题讨论】:

  • 5.6.11 是 PHP 的最新版本,而不是 5.5.27.... 这只是 5.5 分支中的最新版本
  • 但是 str_getcsv() 函数 - 它在内部使用相同的解析代码 - 可以在所有版本的 PHP 上正常工作,回到 5.3.0(当引入 str_getcsv() 时)......你绝对确保文件中的附件是 " (ASCII 0x22) 字符,而不是 &quot 或类似字符
  • 感谢 PHP 修订的精确性。关于你的第二条评论,是的,我很确定。实际上我使用的是 LibreOffice(Ubuntu 上的一个 excel ripoff),它是软件,而不是我,添加了 "。即便如此,当我在文本编辑器中打开文件时,会显示 " 字符,而不是其他任何内容。
  • 在字符串上尝试bin2hex() 或使用十六进制编辑器来确保" 实际上都是ASCII 0x22。
  • 在这里工作得很好(从 PHP 5.1.0 开始),当我将给定的字符串写入临时文件时:3v4l.org/6UV1V

标签: php csv fgetcsv php-5.5


【解决方案1】:

好的,解决了。

这是每个人都在怀疑的:文件的编码搞砸了。我不知道这是哪种编码,但每当我尝试打开 CSV 时,LibreOffice 都会建议我使用 Unicode。

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

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

【讨论】:

  • 我知道这是一个较老的问题/答案。以防万一有人偶然发现它。 fgetcsvstr_getcsv 将使用 PHP 使用的内部编码。一个技巧是使用str_getcsv(mb_convert_encoding(file_get_contents($file), mb_internal_encoding(), 'UTF16')); 之类的东西来读取文件,这将解决问题,并且不需要复制和粘贴内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
相关资源
最近更新 更多