Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
这行代码在 .NET Core / .NET 5+ 项目里的作用一句话就能说清楚:
把 Windows 专用的“代码页”编码(GB2312、Shift-JIS、Windows-1252 等)注册到程序里,否则 Encoding.GetEncoding 会抛 “'XXX' is not a supported encoding” 异常。
下面把来龙去脉、注意事项和常见坑一次性讲清。
-
为什么会有这行代码
-
.NET Core 设计之初要跨平台,而代码页(Code Page)是 Windows 的遗留概念,
所以微软只把最通用的几种编码(UTF-8/16/32、ASCII、UTF-7)内置在 CoreFX 里。 -
所有 Windows 代码页(GB2312 936、Big5 950、Shift-JIS 932、Windows-1252 1252 …)被移到一个单独的 NuGet 包:
System.Text.Encoding.CodePages
。 -
这个包默认不被引用,即使引用了也不会自动生效,必须手动把里面的
CodePagesEncodingProvider
注册到全局编码表,否则Encoding.GetEncoding("GB2312")
直接报错。
-
使用步骤(3 步即可)
-
安装包bash
dotnet add package System.Text.Encoding.CodePages
-
程序启动时注册一次(放在 Main 方法最前面即可)csharp
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
-
后面就能正常用了csharp
var enc = Encoding.GetEncoding("GB2312"); // 或 936 var bytes = enc.GetBytes("中文");
-
常见疑问 / 坑
表格
问题 | 回答 |
---|---|
只注册一次就行? | 对,整个 AppDomain 只需一次,重复注册无害。 |
ASP.NET Core 放哪? | Program.cs 的 Main() 里,或 Startup.ConfigureServices 顶部。 |
Linux / macOS 能用吗? | 可以,CodePages 包是纯托管实现,不依赖 Windows API。 |
.NET Framework 项目需要吗? | 不需要,Framework 本身就带代码页。 |
注册后性能影响? | 仅第一次 GetEncoding 会查表,之后与内置编码一样快。 |
打包体积会变大多少? | 大约 500 KB,只多一个 DLL。 |
-
完整示例
csharp
using System;
using System.Text;class Program
{static void Main(){// 1. 注册代码页提供程序Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);// 2. 使用 GB2312 编码Encoding gb2312 = Encoding.GetEncoding("gb2312");byte[] bytes = gb2312.GetBytes("你好,代码页");Console.WriteLine(BitConverter.ToString(bytes));}
}
-
一句话总结
想在 .NET Core / .NET 5+ 里用 GB2312、Shift-JIS、Windows-1252 等老编码,
先装
即可。
先装
System.Text.Encoding.CodePages
包,再在程序启动时写Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
即可。