當 PHP 產生 UTF-8 編碼的 CSV 檔案供 Excel 開啟時,若缺少 BOM (Byte Order Mark),中文內容常會顯示亂碼。本文說明 BOM 概念並提供一鍵加入的實作程式碼。
BOM 是位於檔案最前端的幾個不可見位元組 (EF BB BF),告訴編輯器或試算表軟體:「這是 UTF-8 編碼」。Windows 記事本儲存 UTF-8 時會自動加入,但 PHP 輸出檔案預設不包含。
在輸出 CSV 內容前,直接輸出 BOM 字元:
$filename = "export_" . date('Ymd') . ".csv";
// 設定下載標頭
header('Expires: ' . gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME'] + 10) . ' GMT');
header('Cache-Control: max-age=10');
header('Content-Type: text/csv; charset=utf-8');
header("Content-Disposition: attachment; filename={$filename}");
// 輸出 BOM (UTF-8)
echo "\xEF\xBB\xBF";
// 假設 $table 為二維陣列資料
foreach ($table as $row) {
echo implode(",", $row) . "\r\n";
}
\xEF\xBB\xBF 為 UTF-8 BOM 的十六進位表示charset=utf-8 標頭,雙重確保編碼正確後台匯出會員名單、訂單報表、資料備份等需由 Excel 開啟的 CSV 下載功能。