2016-08-18 12 views
1

私はこのコードをCSVファイルを読むために持っています。 Iは、配列の配列にキーのヘッダ列の最初の行を使用しようとすると、最初の列「タイプ」は、BOMが含まれているためBOMを使用してPHPでUTF CSVファイルを読むにはどうすればよいですか?

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

しかし、私はエラーを取得します。 BOMはファイルの内容に含まれており、次に配列キーに含まれています。文字列 'Type'は、BOM <U+FEFF>を含んでいるため、4ではなく7文字と考えています。

文字列(7)メッセージと "タイプ"
PHPお知らせ 'のYii \ベースの\ ErrorException' '未定義のインデックス:タイプ'

file()関数はUTFのためのオプションがありません。 file()を使用してUTFファイルを読み取るにはどうすればよいですか?

答えて

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は、あなたがして、存在しない可能性がある場合このアルゴリズムを強化する必要があります。

+0

シュート。私は、Javaストリームのようなファイルエンコーディングを設定できることを期待していました。私は '$ csv = array_map(function($ line){ } str_getcsv(str_replace("¥xEF¥xBB¥xBF "、 '$ line));#strip BOM }、file($ file)を返します。 ' – Chloe

+1

ええ、良いか悪いかにかかわらず、PHPエンジンはファイルをバイトストリームとして扱う基礎となるCライブラリを薄く覆い隠すので、ファイルレベルの知識はエンジンレベルにはありません。別に、あなたのソリューションは、どこの行であっても、どこにあっても望ましくないかもしれないBOMシーケンスを取り除きます(str_replaceの場合は1つ、str_getcsvの場合はもう1つ)。望ましくない可能性もある。 – bishop

関連する問題