| 屬性 | 類型 | 作用層面 | HTTP 標頭影響 |
|---|---|---|---|
| Response.ContentEncoding | Encoding | 服務端字節流 → 字符串編碼轉換 | Content-Type charset 參數 (若 Charset 未顯式設置) |
| Response.Charset | string | 告訴瀏覽器如何解碼顯示 | 直接設置 Content-Type charset 參數 |
Response.ContentEncoding = Encoding.GetEncoding("gb2312"); // 字節按 GB2312 編碼
Response.Charset = "utf-8"; // 告訴瀏覽器按 UTF-8 解碼
Response.Write("中文測試");
結果:瀏覽器顯示亂碼,但「查看源文件」正常。
結論:ContentEncoding 決定字節生成,Charset 決定瀏覽器解碼,兩者必須一致。
Response.ContentEncoding = Encoding.GetEncoding("gb2312");
HTTP 標頭:`Content-Type: text/html; charset=gb2312`
結論:未設置 Charset 時,自動同步 ContentEncoding 的編碼名。
Response.ContentEncoding = Encoding.GetEncoding("gb2312");
Response.Charset = "invalid-charset";
HTTP 標頭:`Content-Type: text/html; charset=invalid-charset`
結果:瀏覽器忽略無效 charset,回退使用 ContentEncoding 對應編碼,顯示正常。
結論:瀏覽器有容錯機制,但不可依賴。
Response.ContentEncoding = Encoding.GetEncoding("gb2312");
Response.Charset = "";
HTTP 標頭:`Content-Type: text/html` (無 charset 參數)
結果:瀏覽器按默認編碼或頁面 `` 標簽解碼,通常正常。
// Global.asax 或 BasePage
protected void Application_BeginRequest()
{
Response.ContentEncoding = Encoding.UTF8;
Response.Charset = "UTF-8"; // 顯式聲明,雖然可省略
}
// 或 web.config 全局
public void DownloadFile(string filePath, string fileName)
{
Response.Clear();
Response.Buffer = true;
// 關鍵:文件流不經字符編碼,直接二進制傳輸
Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1"); // 或不設置
Response.Charset = ""; // 禁用 charset,避免瀏覽器嘗試解碼二進制
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", $"attachment;filename={HttpUtility.UrlEncode(fileName, Encoding.UTF8)}");
Response.TransmitFile(filePath);
Response.End();
}
Response.Clear();
Response.Buffer = true;
Response.Charset = "GB2312"; // 老版本 Office 需求
Response.ContentEncoding = Encoding.GetEncoding("GB2312");
Response.ContentType = "application/ms-word";
Response.AddHeader("Content-Disposition", "attachment;filename=Report.doc");
Response.Write(htmlContent); // 包含中文的 HTML 字符串
Response.End();
| 場景 | ContentType | 典型 Charset |
|---|---|---|
| HTML 頁面 | text/html | UTF-8 |
| JSON API | application/json | UTF-8 |
| XML 數據 | application/xml / text/xml | UTF-8 |
| 文件下載 | application/octet-stream | 空/不設置 |
| Word 文檔 | application/msword | GB2312/UTF-8 |
| Excel 文檔 | application/vnd.ms-excel | GB2312/UTF-8 |
| PDF 文檔 | application/pdf | 不適用 |
| 圖片 | image/jpeg, image/png | 不適用 |
// 1. 緩存控制
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
// 2. 安全頭
Response.AppendHeader("X-Content-Type-Options", "nosniff");
Response.AppendHeader("X-Frame-Options", "DENY");
Response.AppendHeader("Content-Security-Policy", "default-src 'self'");
// 3. 跨域 (CORS)
Response.AppendHeader("Access-Control-Allow-Origin", "https://trusted.com");
Response.AppendHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
Response.AppendHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
// 4. 文件下載強制
Response.AppendHeader("Content-Disposition", "attachment;filename=report.pdf");
// 5. 頁面定時刷新/跳轉
Response.AppendHeader("Refresh", "5;url=/dashboard"); // 5秒後跳轉
// 6. 302 重定向 (等同 Response.Redirect)
Response.Status = "302 Found";
Response.AppendHeader("Location", "/login");
// 7. Basic Auth 提示
Response.Status = "401 Unauthorized";
Response.AppendHeader("WWW-Authenticate", "Basic realm=\"Secure Area\"");
編碼問題 99% 源於「生產端編碼 ≠ 接收端聲明」,統一 UTF-8 並顯式聲明,徹底告別亂碼。