.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.
Install-Package System.Text.Encoding.CodePages
或 dotnet add package System.Text.Encoding.CodePages。using System.Text;
using System.Text.Encoding.CodePages; // 命名空間
// Program.cs / Startup 建構子 / Main 最早處
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var gb2312 = Encoding.GetEncoding("GB2312"); // 成功
var big5 = Encoding.GetEncoding("Big5"); // 成功
byte[] bytes = gb2312.GetBytes("中文"); // 編碼
string s = gb2312.GetString(bytes); // 解碼
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 為單例,內建完整編碼對照表。掌握 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance),即可在 .NET Core / .NET 5+ 專案無痛支援中文舊編碼,完成舊系統遷移與檔案交換需求。