首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 匯出 CSV 檔案中文亂碼徹底解決:編碼與 BOM 完整指南

     編輯:ASP.NET 基礎

CSV 匯出最常見坑:**中文亂碼**。根因在於 Excel 開啟 CSV 時的編碼判斷邏輯。本文提供兩種經實測有效的解決方案。

核心原則:指定編碼 + 加入 BOM

  • **編碼**:繁中環境用 `Big5`/`CP950`,簡中用 `GB2312`/`CP936`,跨平台相容性最好用 **UTF-8 with BOM**
  • **BOM (Byte Order Mark)**:`EF BB BF` 三位元組標記,讓 Excel 確信此為 UTF-8,自動正確解碼中文

方案一:檔案串流寫入(適合大量資料)

string filePath = Server.MapPath("~/exports/data.csv");
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
using (StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding("GB2312"))) // 或 new UTF8Encoding(true) 加 BOM
{
    sw.WriteLine("自動編號,姓名,年齡");
    foreach (DataRow dr in dt.Rows)
    {
        sw.WriteLine($"{dr[\"Id\"]},{dr[\"Name\"]},{dr[\"Age\"]}");
    }
}

Response.Clear();
Response.ContentType = "application/ms-excel";
Response.AddHeader("Content-Disposition", $"attachment; filename={Server.UrlEncode(Path.GetFileName(filePath))}");
Response.WriteFile(filePath);
Response.End();

方案二:直接輸出至 Response(無暫存檔,效能更好)

string fileName = $"Export_{DateTime.Now:yyyyMMddHHmmss}.csv";

Response.Clear();
Response.Buffer = true;
Response.Charset = "GB2312"; // 或 UTF-8
Response.ContentEncoding = Encoding.GetEncoding("GB2312"); // 關鍵:指定輸出編碼
Response.ContentType = "application/ms-excel";
Response.AddHeader("Content-Disposition", $"attachment; filename={fileName}");

// 手動寫入 UTF-8 BOM(若用 UTF-8)
// Response.BinaryWrite(new byte[] { 0xEF, 0xBB, 0xBF });

StringBuilder sb = new StringBuilder();
sb.AppendLine("id,name");
sb.AppendLine("1,張三");
sb.AppendLine("2,李四");
sb.AppendLine("3,John Doe");

Response.Write(sb.ToString());
Response.Flush();
Response.End();

編碼選擇決策表

環境推薦編碼BOMExcel 開啟行為
台灣/香港繁中Big5 / CP950不需要預設正確
大陸簡中GB2312 / CP936不需要預設正確
跨地區/現代系統UTF-8必要無 BOM 會誤判為 ANSI 導致亂碼

關鍵代碼片段對照

寫法編碼BOM備註
`new StreamWriter(fs, Encoding.UTF8)`UTF-8**無**預設不寫 BOM
`new StreamWriter(fs, new UTF8Encoding(true))`UTF-8**有**`encoderShouldEmitUTF8Identifier=true`
`Encoding.GetEncoding("GB2312")`GB2312不適用Excel 內建支援
`Response.ContentEncoding = Encoding.UTF8` + `Response.BinaryWrite(BOM)`UTF-8手動加直接輸出模式

完整 UTF-8 BOM 版範例(最通用)

Response.Clear();
Response.Buffer = true;
Response.ContentEncoding = Encoding.UTF8;
Response.ContentType = "text/csv";
Response.AddHeader("Content-Disposition", "attachment; filename=export.csv");

// 寫入 BOM
Response.BinaryWrite(new byte[] { 0xEF, 0xBB, 0xBF });

Response.Write("編號,姓名,部門\n");
Response.Write("1,王小明,資訊部\n");
Response.Write("2,陳大華,業務部\n");
Response.Flush();
Response.End();

驗證清單

  • [ ] `Response.ContentEncoding` 明確設定
  • [ ] UTF-8 時寫入 BOM(`Encoding.UTF8` 建構子或 `BinaryWrite`)
  • [ ] `Content-Type` 設為 `text/csv` 或 `application/ms-excel`
  • [ ] 檔名 `Content-Disposition` 經 `UrlEncode`
  • [ ] 測試:Excel 直接雙擊開啟、記事本開啟、VS Code 開啟皆正常

掌握「編碼明確指定 + UTF-8 必加 BOM」雙重保險,即可徹底解決 CSV 中文亂碼,確保資料在各地區、各工具下正確呈現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved