如何在PHP中读取具有BOM的UTF CSV文件?


How do I read a UTF CSV file in PHP with a BOM?

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

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

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

字符串(7)"类型"
PHP通知'yii'base' errorrexception '与消息'未定义的索引:类型'

file()函数没有UTF选项。我如何使用file()读取UTF文件?

我个人会避免使用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可能不存在,那么您需要增强此算法。