You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 13:12:28