2012-11-08 59 views
9

使用PHP 5.3 fgetcsv函數,由於編碼問題,我遇到一些問題。請注意,該文件具有西班牙語「特殊」拉丁字符,如圖形口音á,é,íï...等php fgetcsv - 字符集編碼問題

我得到的CSV文件導出一些結構化數據我有一個MS 2008的Mac Excel文件。

如果我用Mac OS X TextEdit應用程序打開它,一切似乎都會變得完美。

但是當我回到我的PHP程序並嘗試使用fgetcsv PHP函數讀取CSV時,我無法正確讀取字符集。

/** 
* @Route("/cvsLoad", name="_csv_load") 
* @Template() 
*/ 
public function cvsLoadAction(){ 
    //setlocale(LC_ALL, 'es_ES.UTF-8'); 
    $reader = new Reader($this->get('kernel')->getRootDir().'/../web/uploads/documents/question_images/2/41/masiva.csv'); 

    $i = 1; 
    $r = array("hhh" => $reader -> getAll()); 

    return new Response(json_encode($r, 200)); 
} 

正如你所看到的,我曾嘗試也使用setlocalees_ES.UTF-8。但沒有任何工作。

讀一部分來自這裏:

public function getRow() 
{ 
    if (($row = fgetcsv($this->_handle, 10000, $this->_delimiter)) !== false) { 
     $this->_line++; 
     return $this->_headers ? array_combine($this->_headers, $row) : $row; 
    } else { 
     return false; 
    } 
} 

看看我得到的$ row變量每行讀數後:

enter image description here

那些?字符被認爲是與圖形元音他們的口音。

那裏的任何線索?如果我使用MS Excel for Windows,它會工作嗎?如何在運行時知道文件的確切編碼並在讀取之前進行設置? (對那些西班牙語的人來說,不要因爲這些文本中的這種可怕的醫療材料而受到驚嚇;))。

+1

同樣的問題。 UTF8編碼的CSV文件可以在一臺服務器上正常導入,但不會導入其他服務器。結束寫我自己的CSV閱讀器。 –

+0

FWIW,你不能不知道*文件的編碼而不被告知。你可以猜出你什麼時候閱讀它,然後進行相應的轉換,但是沒有什麼東西比被告知編碼更可靠。 – cmbuckley

+0

謝謝cbuckley。 「相應地轉換」是什麼意思,嘗試猜測並詢問用戶是否批准導入?如果不是,繼續嘗試其他編碼的原點? – ElPiter

回答

28

試試這個:

function convert($str) { 
    return iconv("Windows-1252", "UTF-8", $str); 
} 

public function getRow() 
{ 
    if (($row = fgetcsv($this->_handle, 10000, $this->_delimiter)) !== false) { 
     $row = array_map("convert", $row); 
     $this->_line++; 
     return $this->_headers ? array_combine($this->_headers, $row) : $row; 
    } else { 
     return false; 
    } 
} 
+2

+1。請注意[docs](http://php.net/manual/en/function.fgetcsv.php):如果文件是單字節編碼的(例如CP1252),但區域設置爲多字節,則fgetcsv不會按預期工作。 – cmbuckley

+0

這是一個! :) 非常感謝。只是一些評論:首先,需要聲明爲靜態函數convert並將其映射到array_map中作爲'self:convert';第二,在我的情況下,它是iconv(「macintosh」,「UTF-8」,$ str),因爲用於Mac OS的MS Excel使用Mac OS Roman導出爲CSV。最後,儘管這是一個很好的答案,對我的幫助確實很大,但仍然不能解決我的需求,因爲我不知道我的用戶是否會從Mac或PC上傳文件或任何其他任何線索如何檢測哪個是上傳文件的編碼?再次感謝!! – ElPiter

+0

你需要使用啓發法。首先看看它是否是有效的UTF-8或UTF-16,如果不是,則確定PC/MAC(來自用戶代理標題)並使用Windows-1252用於PC和Macintosh用於mac。當然,如果用戶不使用拉丁腳本,則可以使用Windows-1251(西里爾語的Windows)等。有人必須爲此編寫一個庫:D – Esailija

0

這很可能與excel在保存時編碼文件的方式有關。

嘗試上傳.xls文件到Google Docs和下載爲.csv

+0

我也試過了,但我覺得它變得更糟。不過,我會再試一次。感謝您的快速響應。 :) – ElPiter