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

解決 ASP.NET Core 輸出中文亂碼:Encoding.RegisterProvider 與 CodePages 註冊完整指南

     編輯:ASP.NET 基礎

.NET Core 預設僅支援 UTF-8/UTF-16 等 Unicode 編碼,**不內建 GB2312、Big5、Shift_JIS** 等舊編碼。直接呼叫 Encoding.GetEncoding("GB2312") 會拋出 NotSupportedException。解法:引用 System.Text.Encoding.CodePages 套件並呼叫 Encoding.RegisterProvider 註冊擴充編碼提供者。

問題重現

Console.WriteLine("您好,北京歡迎你"); // 正常 (主控台編碼為 UTF-8)
Encoding.GetEncoding("GB2312"); // 擲出例外
// 'GB2312' is not a supported encoding name.
// For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.

解決步驟

  1. 安裝 NuGet 套件
    Install-Package System.Text.Encoding.CodePages
    或 dotnet add package System.Text.Encoding.CodePages。
  2. 啟動時註冊 Provider
    using System.Text;
    using System.Text.Encoding.CodePages; // 命名空間
    
    // Program.cs / Startup 建構子 / Main 最早處
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
  3. 後續即可正常使用
    var gb2312 = Encoding.GetEncoding("GB2312"); // 成功
    var big5 = Encoding.GetEncoding("Big5");     // 成功
    byte[] bytes = gb2312.GetBytes("中文");      // 編碼
    string s = gb2312.GetString(bytes);          // 解碼

ASP.NET Core 中應用場景

  • 舊系統整合:讀取/寫入 GB2312 CSV、XML、固定寬度文字檔。
  • 回應編碼:Response.ContentType = "text/html; charset=gb2312" 配合 gb2312.GetBytes(html) 輸出。
  • 請求解碼:Request.Body 讀取位元組 → gb2312.GetString(bytes)。
  • 日誌/檔案:File.WriteAllText(path, content, gb2312)。

完整程式碼範例

using System;
using System.Text;
using System.Text.Encoding.CodePages;

class Program {
    static void Main() {
        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
        Console.OutputEncoding = Encoding.UTF8; // 主控台輸出 UTF-8

        string msg = "您好,北京歡迎你";
        Console.WriteLine(msg);

        var gb = Encoding.GetEncoding("GB2312");
        byte[] data = gb.GetBytes(msg);
        Console.WriteLine($"GB2312 位元組: {BitConverter.ToString(data)}");

        string decoded = gb.GetString(data);
        Console.WriteLine($"解碼回字串: {decoded}");
    }
}

注意事項

項目說明
註冊時機**應用程式啟動最早期** (Main、Startup 建構子),避免遺漏。
效能註冊一次即可全域生效,無額外開銷。
跨平台CodePages 內建表格,**無平台相依性**,Linux/Windows/macOS 皆可用。
替代方案新專案**統一使用 UTF-8**,避免編碼地獄;僅維護舊系統整合時使用 CodePages。
支援編碼GB2312、GBK、GB18030、Big5、Shift_JIS、EUC-KR、ISO-8859 系列、Windows-1252 等 100+ 編碼。

原理補充

  • Encoding.RegisterProvider 接受 EncodingProvider 實例,CodePagesEncodingProvider.Instance 為單例,內建完整編碼對照表。
  • .NET Framework 內建所有編碼;.NET Core 為精簡跨平台,移除舊編碼,**由 NuGet 套件按需載入**。

掌握 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance),即可在 .NET Core / .NET 5+ 專案無痛支援中文舊編碼,完成舊系統遷移與檔案交換需求。

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