Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)了解
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);即可。
浙公网安备 33010602011771号