CSV(Comma-Separated Values)是數據交換的常用格式。本文介紹如何使用 PHP 生成支援 Tab 鍵分隔與逗號分隔兩種格式的 CSV 文件,並解決中文編碼與 BOM 頭問題。
<?php
// 設置響應頭
header("Content-type: text/csv; charset=utf-8");
header("Content-Disposition: attachment; filename=export_tab.csv");
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
header('Pragma: public');
// 準備數據:使用 \t 作為分隔符,\n 換行
$data = "\xEF\xBB\xBF" . "欄位1\t欄位2\t欄位3\n數據1\t數據2\t數據3";
// 關鍵:轉為 UCS-2 編碼,確保 Excel 正確識別中文
$data = iconv('utf-8', 'ucs-2', $data);
echo $data;
?>
<?php
header("Content-type: text/csv; charset=utf-8");
header("Content-Disposition: attachment; filename=export_comma.csv");
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
header('Pragma: public');
$data = "欄位1,欄位2,欄位3\n數據1,數據2,數據3";
// 中文環境建議轉 GBK,避免 Excel 亂碼
$data = iconv('utf-8', 'gbk', $data);
echo $data;
?>
| 目標環境 | 推薦編碼 | 備註 |
|---|---|---|
| Excel (Windows) | GBK / UCS-2 | 原生支援最好 |
| Excel (Mac) | UTF-8 + BOM | 較新版本支援良好 |
| 文本編輯器/程序解析 | UTF-8 | 通用標準 |
對於包含逗號、換行符、引號的複雜字段,建議使用內建 fputcsv():
$fp = fopen('php://output', 'w');
// 寫入 BOM
fwrite($fp, "\xEF\xBB\xBF");
// 寫入標題
fputcsv($fp, ['姓名', '地址', '備註'], "\t");
// 寫入數據
fputcsv($fp, ['張三', '北京市,朝陽區', '包含"引號"'], "\t");
fclose($fp);
fputcsv() 自動處理轉義