PHP CSV-Upload UTF-8(带和不带BOM)

时间:2016-06-09 13:36:25

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

有人可能会解释我的区别 - 以及如何识别或更改格式?

我是一个简单的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"
   }
}

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

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

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

2 个答案:

答案 0 :(得分:0)

自己找到它。不知道,如果它很优雅 - 但它有效......

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;
}

答案 1 :(得分:0)

背景

我不知道我处于同一情况。我只有在无法使用从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

轶事:

我在这里放置了此解决方案,希望将google搜索与无法访问数组中的特定键关联到BOM UTF8 CSV上载。(这是我需要的,但无法找到),我希望可能为一些拼命寻找灵魂的人提供帮助。