Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)不会添加额外的编码提供程序。

11

我正在开发一个netcoreapp2.0控制台应用程序,需要访问.NET的整个编码包。

我已经从这个页面添加了System.Text.Encoding.CodePages Version=4.4.0 Nuget包到我的项目,并且多次进行了清理/还原项目操作。

然而,我无法获取我需要的额外编码。

以下是代码:

Console.WriteLine(Encoding.GetEncodings().Length);
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Console.WriteLine(Encoding.GetEncodings().Length);

返回:

8
8

并且 Encoding 类中不添加任何额外编码。

这是我项目中所有的引用:

<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="2.0.0" />
<PackageReference Include="System.Data.HashFunction.xxHash" Version="2.0.0-ci-00012" />
<PackageReference Include="Nager.PublicSuffix" Version="1.1.0" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.4.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />

<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />

我在这里做错了什么吗?

更新

重新安装 .NET Core SDK 2.0.2 后,一切开始正常工作了,我可以使用扩展的编码代码页,使用 Encoding.GetEncoding() 方法,但是 Encoding.GetEncodings() 仍然返回最初的8个编码代码页。


你的packages.config文件中是否缺少对Microsoft.NETCore.Platforms 2.0的引用?这是该库的一个依赖项。 - Gabriel Rainha
1
就我在Visual Studio中所看到的,它已作为 Microsoft.NETCore.App SDK 集的一部分加载,并由 <Project Sdk="Microsoft.NET.Sdk"> 在我的项目中设置。然而,我尝试添加 <PackageReference Include="Microsoft.NETCore.Platforms" Version="2.0.0" /> ,不幸的是它没有起作用。 - Rojan Gh.
将您的更新作为答案。这可能有助于未来的人们。 - Gabriel Rainha
@RojanGh。你解决了这个问题吗? - Joe B
@JoeB 看起来,所有额外的编码实际上都被添加并由 Encoding 类使用,但是当您调用 Encoding.GetEncoding() 时它们不会被添加到编码列表中。因为我并不真正需要这个列表,我只是想让它工作,所以我没有深入研究。 - Rojan Gh.
2个回答

9
2022年8月更新: 感谢zapoo的评论,我们知道虽然在.net framework 4.8中不需要此解决方案,但在.net 6.0中需要。
针对Gabriel Rainha的建议,我将其作为答案添加,并希望能帮助其他人。
我清理了Nuget缓存,修复了我的“.NET Core SDK 2.0.2”安装,进行了“解决方案和项目清理”,重建了我的项目,此时Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)代码开始正常工作。
现在我可以使用Encoding.GetEncoding()方法访问额外的代码页,但是在添加额外编码后,Encoding.GetEncodings()方法仍然返回相同的编码列表。
从我的角度来看,在添加更多编码后,Encoding.GetEncodings()方法应该返回所有可用的编码。

3
为什么这行代码对程序很重要:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)。 我也在我的代码中使用了这行代码,但不知道它为何必要。 - Bijan Negari
1
我还没有深入研究@BijanNegari的代码,我们可能是错的,但从外观上看,我可以说缺失的提供程序将被添加到框架已有的提供程序中。 - Rojan Gh.
1
添加 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) 对于我的 Azure Functions 有所帮助。 - zapoo
@zapoo 很高兴这么多年后它仍然有所帮助。 :) - Rojan Gh.
1
@RojanGh。感谢您的解决方案,我还想提一下,我拥有的代码在 .net framework 4.8 中运行良好,但在 .Net 6 中却不行,所以我进行了搜索并找到了您的答案。 - zapoo
显示剩余2条评论

-2
安装NuGet包: System.Text.Encoding和System.Text.Encoding.CodePages

问题明确提到了Nuget包已经安装。 - Rojan Gh.
安装后,它对我完美地运行了。尝试卸载项目,关闭并重新打开Visual Studio也许会有帮助,我想。 - KRISHNA CHAITANYA

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