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” 异常。
下面把来龙去脉、注意事项和常见坑一次性讲清。

  1. 为什么会有这行代码

  • .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") 直接报错。

  1. 使用步骤(3 步即可)

  1. 安装包
    bash
    复制
    dotnet add package System.Text.Encoding.CodePages
     
  2. 程序启动时注册一次(放在 Main 方法最前面即可)
    csharp
    复制
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
     
  3. 后面就能正常用了
    csharp
    复制
    var enc = Encoding.GetEncoding("GB2312");   // 或 936
    var bytes = enc.GetBytes("中文");
     

  1. 常见疑问 / 坑

表格
复制
问题回答
只注册一次就行? 对,整个 AppDomain 只需一次,重复注册无害。
ASP.NET Core 放哪? Program.cs 的 Main() 里,或 Startup.ConfigureServices 顶部。
Linux / macOS 能用吗? 可以,CodePages 包是纯托管实现,不依赖 Windows API。
.NET Framework 项目需要吗? 不需要,Framework 本身就带代码页。
注册后性能影响? 仅第一次 GetEncoding 会查表,之后与内置编码一样快。
打包体积会变大多少? 大约 500 KB,只多一个 DLL。

  1. 完整示例

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));
    }
}
 

  1. 一句话总结

想在 .NET Core / .NET 5+ 里用 GB2312、Shift-JIS、Windows-1252 等老编码,
先装 System.Text.Encoding.CodePages 包,再在程序启动时写
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
即可。
posted @ 2025-10-09 10:54  yinghualeihenmei  阅读(10)  评论(0)    收藏  举报