2014-05-08 52 views
0

Im將php數組導出到csv。將數組導出到CSV ini使用特殊字符的PHP

的錯誤是,所有的特殊字符都搞砸了(例如:A E N),並顯示文件的開始FIELD1,而不是FIELD1

由於內容處置:附件;,如果我評論該行,該文件創建沒有任何問題(遺憾的是,它被下載爲FILENAME .php擴展名)。

# CSV headers 
    header('Cache-Control: public'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-type: application/csv; charset=utf-8'); 
    header('Content-disposition: attachment; filename='.date('Y-m-d H\hi').'.csv'); 

    # Columns 
    $o = 'field1,field2,field3,field4'; 
    $o .= "\n"; 

    # Data 
    $rows = array(); 
    foreach($data as $item) { 
     $fields = array(); 
     foreach($item as $field) { 
      $fields[] = $field; 
     } 
     $rows[] = implode(', ', $fields); 
    } 
    $o .= implode("\n", $rows); 
    echo $o; 

任何想法?謝謝!

+1

是BOM。 –

+0

您應該考慮在文件名周圍使用雙引號:'filename =''。date('Y-m-d H \ hi')。'。csv「''另外,爲什麼要設置兩種不同的內容類型? –

+0

我在Sublime2(osx)中工作。該文件是utf-8,沒有BOM。 – andufo

回答

1

正如Dagon所言,是BOM,可能會導致正在讀取的文件出現問題(特別是如果它是在Windows上的CMD中完成的話)。從您的腳本文件中刪除BOM。

至於特殊字符,您可能需要轉換它們,特別是如果您的源不是UTF-8。

我有一次類似的問題,我的解決方案是證明輸入正在被正確讀取並在輸出前轉換它們。

轉換用的字符,我做了這樣的事情:

mb_convert_case($result['products_name'], MB_CASE_UPPER, "UTF-8"); 

要證明我是用UTF-8的工作,我連接到我的數據庫時發出

$connection->set_charset("utf8"); 

保重。

+0

嗨!我在Sublime2(osx)工作。該文件是utf-8,沒有BOM。 mysql的字符集也是utf8。如果我不強制下載與內容處置,字符都很好。 – andufo