【问题标题】:PHP CSV-Upload UTF-8 (with and without BOM)PHP CSV-上传 UTF-8(有和没有 BOM)
【发布时间】:2016-06-09 13:36:25
【问题描述】:

有人可以解释一下区别 - 以及如何识别或更改格式吗?

我有一个简单的 HTML-Upload-Form,上传后我用 fgetcsv() 解析文件内容。解析后我有一个这样的数组

array(2) {
  [0]=>
  array(9) {
    ["OrderId"]=>
    string(13) "FG-456887"
    ["Product"]=>
    string(7) "B9876"
  }
  [1]=>
  array(9) {
    ["OrderId"]=>
    string(13) "FG-852562"
    ["Product"]=>
    string(7) "B9877"
   }
}

var_dump() 在使用带有或不带有 BOM 的文件时向我显示(显然)完全相同的转储,但是当我对该数组进行简单循环并检查 OrderId(CSV 中的第一个字段)是否为空时 - 这个当 CSV 在没有 BOM 的情况下编码时,总是失败。当我用 BOM 保存同一个文件时 - 一切正常。

foreach ($data as $position) {
   $orderid = $position["OrderId"];
   if (empty($orderid)) die('No orderid found');
}

这只是第一个字段 - 其他字段都可以。

【问题讨论】:

    标签: php csv file-upload utf-8 byte-order-mark


    【解决方案1】:

    我自己找到的。不知道,它是否优雅 - 但它有效......

    function remove_utf8_bom($text) {
        $bom = pack('H*','EFBBBF');
        $text = preg_replace("/^$bom/", '', $text);
        return $text;
    }
    
    function csv_to_array($filename='', $delimiter=';', $seperator = '"') {
        if(!file_exists($filename) || !is_readable($filename))
                return FALSE;
    
        $csvdata = file($filename);
        $header = NULL;
        $data = array();
        foreach ($csvdata as $line) {
            $row = remove_utf8_bom($line);
            $row = str_getcsv($row,$delimiter,$seperator);
            if(!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        return $data;
    }
    

    【讨论】:

      【解决方案2】:

      背景:

      我不知道我也遇到了同样的情况。当我无法使用从 csv 文件导入的数据时,我才意识到这一点。

      问题:

      从 CSV 文件导入两列时,我无法访问数组第一列中的数据:

      array() => ['project_nr' => '0000000', 'project_name']
      

      我试过了:

      array_keys($myArray);
      

      它按预期工作,但直到进一步分析我才看到第一列“project_nr”是 13 个字符而不是 10 个字符。后来我意识到正在读取 BOM。

      解决方案:

      $str = file_get_contents('yourfile.utf8.csv');
      $bom = pack("CCC", 0xef, 0xbb, 0xbf);
      if (0 === strncmp($str, $bom, 3)) {
         echo "BOM detected - file is UTF-8\n";
         $str = substr($str, 3);
      }
      

      参考:

      Here is where I found the solution

      轶事:

      我把这个解决方案放在这里,希望将无法访问数组中特定键的谷歌搜索连接到 BOM UTF8 CSV 上传。(这是我需要的,但无法找到)我希望它可能帮助一些拼命寻找的灵魂。

      【讨论】:

        猜你喜欢
        • 2014-03-10
        • 2016-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-19
        • 2011-02-04
        • 1970-01-01
        相关资源
        最近更新 更多