【问题标题】:PHP csv parser eating characters like "é", "í", at the start of a fieldPHP csv 解析器在字段开头吃“é”、“í”等字符
【发布时间】:2011-03-29 09:47:26
【问题描述】:

我正在尝试用 PHP 解析一个 csv 文件。我的问题如下:如果有一个用“é”或“í”声明的字段,解析器会从字段的开头吃掉所有这些字符。

该问题仅出现在我的主机上,在本地使用 XAAMP(较新的 PHP 版本)时不存在。我的主机上出现这个bug的PHP版本是:5.2.6-1+lenny9

代码不过是一行 fgetcsv。

while (($program = fgetcsv($handle, 0, ',', '"')) !== FALSE) {...}

此代码已经输出了“吃掉”的版本,例如当被 print_r 查看时。

有什么我可以做的吗?它一定是PHP中的一个错误,从那时起就已经修复了。我发现的另一种选择是通过在字段末尾放置一个逗号来转义序列(我的 csv 源,如果里面有 , ,Google Spreadsheets 会自动将该字段包装在 " " 中)。然后我可以编写一个函数,如果它是逗号,则删除最后一个字符(对此有任何帮助吗?)。

是否是(或曾经是)PHP 中的一个已知错误,是否有任何解决方案?如果没有,您能帮我使用 delete-last-character-if-its-a-comma 功能吗?

【问题讨论】:

  • 您可以使用print PHP_VERSION; 来查找。 fgetcsv manual page 中还有替代实现,您可以尝试。
  • 感谢您的提示,它:5.2.6-1+lenny9

标签: php regex csv fgetcsv


【解决方案1】:

您的实际问题是网络服务器在禁止多字节字符集的语言环境下运行。如果设置为C,我会得到相同的结果:

<?php print_r(str_getcsv("ée, íi, zz, bb, "));

$   LC_ALL=C   php test_getcsv.php

字段中éí 的删减。 [0] => e [1] => i [2] => zz

但是当我这样运行它时:

$   LC_ALL=de_DE.UTF-8  php test_getcsv.php

我得到了正确的结果。 [0] => ée [1] => íi [2] => zz

您需要调查服务器上可用的语言环境,然后在脚本开头使用setlocale(LC_ALL, "xy_zz.UTF-8")

【讨论】:

  • 还是不行。我放了'setlocale(LC_ALL,“hu.UTF-8”);'在函数开始时,但没有区别。它是匈牙利主机,因此必须支持。如果没有产生错误,是否意味着 setlocale 被接受了?我试过 hu_HU.UTF-8 但没有区别。有没有办法打印本地是否被接受?
  • @zsero:如果它不起作用,那么它很可能不受支持。你可以printsetlocale()的返回字符串看看是否被接受。例如,print setlocale("KLINGON.UCS-4") 为空。
  • 我实际上是在尝试找出支持哪些语言环境。我正在做的是setlocale(LC_ALL, 'hu_HU'); setlocale(LC_ALL, "en_US.utf8"); echo(strftime('%Y. %B %d. %A')); 但它仍然是匈牙利语。如果我输入“C”,它会改变。该主机是否可能不支持 UTF-8 语言环境?
  • 您可以使用print system("locale -a") 找出安装了哪些。令人惊讶的是,您可以使用 en_GB.UTF-8 而不是 en_US
  • 感谢您的所有帮助,但该主机似乎不支持 UTF8 语言环境。在我尝试过的所有其他主机上,以下文件在 hu_HU 之后产生了不同的行,但在该主机上,它没有。 setlocale(LC_ALL, "C"); echo(strftime('%Y. %B %d. %A&lt;br&gt;')); setlocale(LC_ALL, "hu_HU"); echo(strftime('%Y. %B %d. %A&lt;br&gt;')); setlocale(LC_ALL, "en_US.utf8"); echo(strftime('%Y. %B %d. %A&lt;br&gt;')); setlocale(LC_ALL, "en_GB.utf8"); echo(strftime('%Y. %B %d. %A&lt;br&gt;')); 我认为我对那个主机没有什么可做的了,我只会做肮脏的删除逗号技巧。
猜你喜欢
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2020-02-15
相关资源
最近更新 更多