專案主體採用 UTF-8 編碼,但引用美工提供的靜態頁面(HTML/CSS/JS)為 GB2312 編碼。直接納入專案後出現:
encodeURIComponent 也無法解決在 Web.config <system.web> 區段加入 globalization 設定:
<globalization
requestEncoding="gb2312"
responseEncoding="gb2312"
fileEncoding="gb2312"
uiCulture="zh-CN"
culture="zh-CN" />
requestEncoding:ASP.NET 解析 Request 表單/QueryString 的編碼responseEncoding:輸出 Response 內容的編碼(含 HTTP 標頭 Charset)fileEncoding:讀取 .aspx/.ascx/.master 等檔案時的預設編碼Content-Type: text/html; charset=gb2312,樣式正常顯示雖然瀏覽器以 GB2312 送出,但後端邏輯/資料庫多為 UTF-8,需在管線早期將 Request.ContentEncoding 改為 UTF-8,讓 ASP.NET 正確解碼參數。
using System;
using System.Web;
using System.Web.Util;
namespace MyProject.Modules
{
public class ContentEncodingModule : IHttpModule
{
public void Init(HttpApplication context)
{
// BeginRequest 最早階段,確保後續所有 Request 讀取皆為 UTF-8
context.BeginRequest += OnBeginRequest;
}
private void OnBeginRequest(object sender, EventArgs e)
{
var app = (HttpApplication)sender;
// 核心:強制將 Request 內容編碼設為 UTF-8
app.Request.ContentEncoding = System.Text.Encoding.UTF8;
}
public void Dispose() { }
}
}
<httpModules>
<add name="ContentEncodingModule" type="MyProject.Modules.ContentEncodingModule, MyProject" />
</httpModules>
注意:IIS 7+ 整合模式請改註冊至 <system.webServer><modules>。
globalization 設定 Response/靜態檔案輸出為 GB2312,滿足舊版瀏覽器渲染需求。BeginRequest 將 Request.ContentEncoding 改為 UTF-8,ASP.NET 後續解析 Request.Form、QueryString 時會以 UTF-8 解碼,還原正確中文。encodeURIComponent 以 UTF-8 編碼 URL,配合後端 UTF-8 解碼即可正確傳遞中文。盡量避免混用編碼。 建議將所有靜態資源(HTML/CSS/JS)統一轉為 UTF-8(含 BOM 或無 BOM 均可),移除
globalization覆寫與 HttpModule,專案編碼單一化,杜絕編碼地獄。
NVARCHAR + 正確 Collation| 誤區 | 正確觀念 |
|---|---|
| 只設 responseEncoding 即可 | 需同時設 requestEncoding,否則參數解碼錯誤 |
| 前端 encodeURIComponent 就能解決所有亂碼 | 後端解碼編碼必須一致,否則無效 |
| fileEncoding 影響輸出編碼 | fileEncoding 僅影響伺服器端讀取原始碼檔案,不影響輸出 |