使用 Encoding.GetEncoding("GB2312") 时遇到异常:'GB2312' 不是受支持的编码名称。

3
在微软文档https://learn.microsoft.com/en-us/dotnet/api/system.text.encoding中,在编码列表部分的编码表中,gb2312行的.NET Framework支持列中有一个标记,这意味着.NET Framework本地支持gb2312编码。但是当我调用时,……
System.Text.Encoding.GetEncoding("gb2312")

在我的程序中,在Win11机器和另一台Windows Server 2008机器上,出现了异常,并显示以下消息:
'GB2312' is not a supported encoding name

但是在我使用的Windows10电脑中构建程序时,它可以正确识别gb2312编码。

我的程序是使用.NET Framework 4.6.2构建的,因此我认为gb2312受到本地支持,那么问题出在哪里呢?

我进行了一些搜索,建议

Encoding.RegisterProvider(new CodePagesEncodingProvider())

但这是.NET Core的解决方案。我认为它没有解决根本原因,也不是.NET Framework的好修复方法。

更新:调用GetEncoding的代码位于一个dll内部。


你有比较那些机器上安装的运行时版本吗? - Fildor
1
如果使用代码页号(936)而不是名称,它是否有效? - dan04
感谢@Fildor,机器之间与问题相关的差异不大。 - Fengtao Ding
谢谢@dan04,gb2312的代码页号(936)也不起作用。 - Fengtao Ding
2个回答

3

试试这个:

System.Text.Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var enc = System.Text.Encoding.GetEncoding("gb2312");

对我来说没问题,谢谢! - Paul W

0

我解决了这个问题,如果有人遇到相同的情况,我想分享一下我的经历。

在谈到根本原因之前,我必须道歉,因为我没有在我的问题中清楚地描述所有细节。调用 System.Text.Encoding.GetEncoding("gb2312") 的是我创建的一个 dll,在 .NET Framework 上构建。

然后有些人制作了一个 exe,调用我的 dll 中的一个 api 并路由到 GetEncoding 行。根本原因是他的 exe 是在 .NET Core 上构建的,有效运行时来自于他的 exe,也就是 .NET Core,而不是来自我的 dll。

所以真正的问题仍然是 .NET Core 默认不支持 gb2312,正如文档所说:https://learn.microsoft.com/en-us/dotnet/api/system.text.encoding

解决方案是也在 .NET Framework 上构建 exe。或者,如果必须基于 .NET Core,可以采用 @Vic F 的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接