2016-08-18 105 views
1

我有這段代碼來讀取一個CSV文件。如何使用BOM讀取PHP中的UTF CSV文件?

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

然而,當我嘗試使用標題列的第一行的鍵數組的數組,我得到一個錯誤,因爲第一列「類型」還包括BOM。 BOM包含在文件內容中,然後包含在數組鍵中。看,它認爲字符串「Type」是7個字符而不是4個,因爲它包含BOM <U+FEFF>

串(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(函數($ line){ return str_getcsv(str_replace(「\ xEF \ xBB \ xBF」,'',$ line));#strip BOM },file($ file)); ' – Chloe

+1

是的,無論更好還是更糟,PHP引擎都精簡地隱藏了底層的C庫,該庫將文件視爲字節流,因此文件級知識在引擎級別不存在。除此之外,你的解決方案將在任何行上刪除BOM序列,不管它出現在哪裏,這可能是不受歡迎的,並且它還需要對文件數據進行兩次完整傳遞(一個用於「str_replace」,另一個用於「str_getcsv」),也可能是不希望的。 – bishop