.NET 6 WinForm下Encoding.GetEncodings()仅返回7个编码的原因咨询
Encoding.GetEncodings() 运行结果差异原因 根本原因
.NET 6 属于新一代跨平台.NET(.NET Core 产品线迭代版本),和传统.NET Framework、C# Interactive 编译器的默认编码支持策略完全不同:
- 从.NET Core 1.0 开始,运行时默认仅内置7种基础通用编码:ASCII、UTF-7、UTF-8、大端/小端UTF-16、大端/小端UTF-32。其余所有代码页编码(含各类EBCDIC编码、GB2312、GBK、ISCII系列等)默认不随运行时内置,也不会被
Encoding.GetEncodings()枚举返回,这就是WinForm程序里只拿到7个编码项的直接原因。 - C# Interactive 编译器默认加载了额外的代码页编码程序集,且隐式完成了编码提供程序注册,因此可以直接枚举到全量140种系统支持的编码。
修复方案
按以下两步操作即可让.NET 6 WinForm程序得到和交互编译器一致的枚举结果:
- 第一步:通过NuGet给项目安装
System.Text.Encoding.CodePages包,该包包含所有未内置的代码页编码实现 - 第二步:在程序启动阶段、执行任何编码获取/枚举逻辑之前,执行编码提供程序注册代码:
// 注册代码页编码提供程序 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
.NET 6 WinForm如果使用顶级语句模板,直接把上述代码写在Application.Run()之前即可;如果使用传统Main方法写法,放在Main方法开头、或者MainForm构造函数中枚举编码的逻辑之前都可生效。
注册完成后再次调用Encoding.GetEncodings()即可枚举到全部140种可用编码,下拉框填充结果和交互窗口输出完全一致。
提示:未注册编码提供程序的情况下,即使明确知道目标编码的CodePage,直接调用
Encoding.GetEncoding()获取非内置编码也会抛出异常,必须先完成上述注册步骤。
内容的提问来源于stack exchange,提问作者Fatih
相关产品推荐
相关产品推荐

