2014-07-03 92 views
2

如何支持非標準的字符。我有一個簡短的腳本讀取一個CSV文件,該文件如下所示:在PHP SplFileObject閱讀CSV

$csv = new SplFileObject($pathToFile, 'r'); 

while (!$csv->eof() && ($row = $csv->fgetcsv()) && $row[0] !== null) { 
    var_dump($row); 
} 

該工程確定,但它有一些問題非標準字符。 CSV中有一些德語單詞,我的具體問題是它有變音困難。行它輸出的類型的一個例子是:

array(5) { 
    [0]=> 
     string(6) "J¦rgen" 
    [1]=> 
     string(8) "Lastname" 
    [2]=> 
     string(14) "[email protected]" 
    [3]=> 
     string(7) "Example" 
    [4]=> 
     string(7) "Example" 
} 

在的Jürgen的ü得到與替換|字符。

我試圖把下面的代碼之前:

mb_internal_encoding('UTF-8'); 

但它沒有任何效果。

在Vi中打開csv文件顯示成功,所以文件在服務器上是正確的。

任何人都可以建議如何在解析CSV時成功處理德語字符?

+0

適用於我。假設你在終端執行它,你使用的是哪種終端編碼?通過瀏覽器試用。 – hek2mgl

+0

我從命令行運行它,但我做了一些調整,從瀏覽器運行併發生相同的事情。 來自CSV的值會被放入MySQL數據庫表中,該表也不會獲取虛擬字符。 (同一系統中的其他PHP腳本,其中數據來自HTTP POST而不是CSV文件,可成功處理變音符號並將它們插入到MySQL中而不會出現問題)。 – Jack

+0

嘗試使用'iconv'(在命令行上)將文件轉換爲'utf-8'。你需要知道什麼是csv文件的輸入編碼。爲此,您需要查看生成csv的程序。如果這是不可能的,我最好的猜測是windows-CP-1252 – hek2mgl

回答

0

所示的代碼本身應該工作。我想這個問題是由CSV文件的字符編碼引起的,這似乎不是utf-8。你需要找出你的輸入文件的編碼是什麼。

一旦你發現了,你可以使用iconv命令將文件轉換爲utf-8。 (在註釋中你告訴輸入編碼是iso-8859-1)。

例子:

iconv -f 'iso-8859-1' -t 'utf-8' input.csv > utf8.csv 

注意!請不要嘗試像這樣直接覆蓋文件:

iconv -f 'iso-8859-1' -t 'utf-8' data.csv > data.csv 

這會覆蓋(截斷)data.csv並導致完全數據丟失。這是因爲在執行命令本身之前,shell會創建並截斷輸出文件。