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

问题描述 投票:1回答:2

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

我有一个简单的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中的第一个字段)是否为空时 - 这总是失败,当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
2个回答
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;
}

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

轶事:

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

© www.soinside.com 2019 - 2024. All rights reserved.