CSV上传 - 使用SplFileObject解析 - 删除BOM

时间:2014-10-31 17:08:19

标签: php csv byte-order-mark

我有一个表单来上传CSV文件:

<form method="post" action="#" enctype="multipart/form-data" accept-charset="utf-8">
  <p><input type="file" name="file" /></p>
  <p><input type="submit" /></p>
</form>

在我的PHP脚本中,我执行以下操作:

$temp = $_FILES["file"]["tmp_name"];

$fobject = new SplFileObject($temp);
$fobject->setFlags(SplFileObject::READ_CSV);
$fobject->setCsvControl(',', '"');

$data = [];
foreach($fobject as $line) {
$data[] = $line;
  print_r($line);
}

现在文件中有BOM显示为

  



在第一个CSV行中。我该如何删除?

我用Google搜索并尝试了一些解决方案(How to remove multiple UTF-8 BOM sequences before "<!DOCTYPE>"?),但没有效果。

我可以使用str_replace,但这似乎不是我的最佳做法。

1 个答案:

答案 0 :(得分:0)

原始帖子摘自这里:chrisguitarguy/no_bom.php

<?php
$file = new \SplFileObject('some_file_with_bom.csv');
// http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8
$bom = pack('CCC', 0xEF, 0xBB, 0xBF);
$first = true;
foreach ($file as $line) {
    if ($first && substr($line, 0, 3) === $bom) {
        $line = substr($line, 3);
    }

    $first = false;

    // your lines don't have a BOM, do your stuff
}

为我工作!