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

ASP.NET 專案混用 GB2312 與 UTF-8 編碼導致中文亂碼解決方案

     編輯:ASP.NET 基礎

問題背景

專案主體採用 UTF-8 編碼,但引用美工提供的靜態頁面(HTML/CSS/JS)為 GB2312 編碼。直接納入專案後出現:

  1. IE6/舊版瀏覽器樣式錯亂(置中失效、版面崩壞)
  2. 頁面傳遞中文參數時出現亂碼,即使前端使用 encodeURIComponent 也無法解決

階段一:統一要求瀏覽器以 GB2312 解析(解決樣式問題)

在 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,樣式正常顯示

階段二:Request 內容轉回 UTF-8(解決參數亂碼)

雖然瀏覽器以 GB2312 送出,但後端邏輯/資料庫多為 UTF-8,需在管線早期將 Request.ContentEncoding 改為 UTF-8,讓 ASP.NET 正確解碼參數。

實作 HttpModule

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() { }
    }
}

Web.config 註冊模組

<httpModules>
  <add name="ContentEncodingModule" type="MyProject.Modules.ContentEncodingModule, MyProject" />
</httpModules>

注意:IIS 7+ 整合模式請改註冊至 <system.webServer><modules>。

原理說明

  1. globalization 設定 Response/靜態檔案輸出為 GB2312,滿足舊版瀏覽器渲染需求。
  2. HttpModule 在 BeginRequest 將 Request.ContentEncoding 改為 UTF-8,ASP.NET 後續解析 Request.Form、QueryString 時會以 UTF-8 解碼,還原正確中文。
  3. 前端 encodeURIComponent 以 UTF-8 編碼 URL,配合後端 UTF-8 解碼即可正確傳遞中文。

最佳實務建議

盡量避免混用編碼。 建議將所有靜態資源(HTML/CSS/JS)統一轉為 UTF-8(含 BOM 或無 BOM 均可),移除 globalization 覆寫與 HttpModule,專案編碼單一化,杜絕編碼地獄。

  • Visual Studio:檔案 → 進階儲存選項 → UTF-8
  • Notepad++ / VS Code:編碼 → 轉換為 UTF-8
  • 資料庫欄位採用 NVARCHAR + 正確 Collation
  • 前端 ``、JS 檔案儲存為 UTF-8

常見誤區

誤區正確觀念
只設 responseEncoding 即可需同時設 requestEncoding,否則參數解碼錯誤
前端 encodeURIComponent 就能解決所有亂碼後端解碼編碼必須一致,否則無效
fileEncoding 影響輸出編碼fileEncoding 僅影響伺服器端讀取原始碼檔案,不影響輸出
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved