如何使用BOM读取PHP中的UTF CSV文件?

时间:2016-08-18 20:30:58

标签: php arrays csv utf-8

我有这段代码来读取CSV文件。

$csv = array_map('str_getcsv', file($file));
var_dump($csv[0][0]).PHP_EOL;
...
echo $a['Type'];exit;

然而,当我尝试将第一行标题列用于数组数组的键时,我收到错误,因为第一列&#39;键入&#39;还包括BOM。 BOM包含在文件内容中,然后包含在数组键中。看,它认为字符串&#39; Type&#39;是7个字符而不是4个字符,因为它包含BOM <U+FEFF>

  

string(7)&#34; Type&#34;
  PHP注意&#39; yii \ base \ ErrorException&#39;使用消息&#39;未定义的索引:输入&#39;

file()功能没有UTF选项。如何使用file()读取UTF文件?

1 个答案:

答案 0 :(得分:1)

我个人避免使用file,因为它会将整个文件读入内存。但假设您对此很好,请手动过滤BOM:

$lines = file($file);
$lines[0] = preg_replace(sprintf('/^%s/', pack('H*','EFBBBF')), $lines[0]);
$csv = array_map('str_getcsv', $lines);

未经测试,这是我使用的替代方案:

$fp = fopen($file, 'r');
fseek($fp, 3);
while ($line = fgetcsv($fp)) {
    $csv[] = $line;
}
fclose($fp);

如果BOM可能不存在,那么您需要加强此算法。