2011-01-28 32 views
1

我試圖讓我的客戶端在Excel中查看一些MySQL數據。我已經使用PHP的fputcsv()函數,如:帶有UTF-8的PHP fputcsv問題

public function generate() { 
    setlocale(LC_ALL, 'ko_KR.UTF8'); 

    $this->filename = date("YmdHis"); 
    $create = $this->directory."Report".$this->filename.".csv"; 

    $f = fopen("$create","w") or die("can't open file"); 
    fwrite($f, "\xEF\xBB\xBF"); 

    $i = 1; 
    $length = count($this->inputarray[0]); 

    fwrite($f, $this->headers."\n"); 

    // print column titles 
    foreach($this->inputarray[0] as $key=>$value) { 
    $delimiter = ($i == $length) ? "\n\n" : ","; 
    fwrite($f, $key.$delimiter); 
    $i++; 
    } 

    // print actual rows 
    foreach($this->inputarray as $row) { 
    fputcsv($f, $row); 
    } 
    fclose($f); 
    } 

我的客戶是韓國人,和MySQL數據庫的一個好大塊包含utf8_unicode_ci值。通過使用上述功能,我成功​​生成了一個CSV文件,其中包含正確編碼的數據,可以在我的計算機上以Excel打開(Win​​7英文版),但是當我在客戶端計算機上使用Excel打開該文件時,再次被打破。我嘗試將標題(\ xEF \ xBB \ xBF)取出,並註釋掉setlocale,但無濟於事。

你能幫我弄清楚嗎?

+1

你可以嘗試添加`mb_internal_encoding(「UTF-8」);`在頂部,告訴我會發生什麼? – tawfekov 2011-01-28 02:25:55

+0

查看BOM(字節順序掩碼)。他們使用的是哪個版本的Excel,2003,2007等? – 2011-01-28 04:57:56

回答

0

嘗試將數據作爲UTF-16LE編碼,並確保該文件具有相應的BOM。

另外,發送你的客戶一個Excel文件,而不是一個CSV,則編碼不應該是一個問題

1

如果像你說的,你的CSV文件「正確編碼數據」 - 即它包含一個有效的UTF-8字節流,並且假設客戶站點上的文件的字節流是相同的(例如,由於文件傳輸問題未在傳輸中損壞),那麼聽起來像客戶端上的Excel問題機器沒有正確解釋UTF-8。這可能是因爲它不受支持,或者導入時需要選擇某些選項來指示編碼。因此,您可以嘗試以不同的編碼生成文件(使用mb_convert_encodingiconv)。

如果讓您的客戶端導出包含韓文字符的CSV,則可以查看該文件並確定正在生成的編碼。您應該嘗試使用該編碼。