.NET Core不识别Windows 1252编码,如何解决?

138

这个程序在为.NET 4编译时运行良好,但是在为.NET Core编译时不起作用。我理解关于编码不支持的错误,但不知道如何修复它。

Public Class Program
    Public Shared Function Main(ByVal args As String()) As Integer
        System.Text.Encoding.GetEncoding(1252)
    End Function
End Class

这不是一个真正的修复,因为它改变了问题中的代码。但是,如果使用代码页1252的原因是读取/写入ISO-8859-1字符,则可以将其替换为28591,该编码已包含在.NET Core中,无需添加CodePages包:https://learn.microsoft.com/en-us/dotnet/api/system.text.codepagesencodingprovider?view=netcore-3.1请注意,一些超出ISO-8859-1的字符在代码页1252中是不同的 https://en.wikipedia.org/wiki/ISO/IEC_8859-1#Windows-1252,特别是欧元符号(€)。 - stb
3个回答

252

1
我应该在哪里安装或运行“dotnet add package System.Text.Encoding.CodePages”目录? - Rich
2
@Rich 你应该从包含你的 csproj 的目录中运行它。如果你使用的是 Visual Studio,你也可以使用包管理器而不是命令行。 - svick
以上内容对于某些特定的编码属性(如HeaderName)在.NET Core 2.0+上无法提供帮助。这仍然会抛出“NotSupportedException”异常。 - Alex
2
顺便提一下:不应该使用变量输入的 CodePagesEncodingProvider.Instance.GetEncoding。https://learn.microsoft.com/en-us/dotnet/api/system.text.codepagesencodingprovider?view=netcore-3.1 上说:“不应调用 EncodingProvider.GetEncoding 重载”。原因可能是 EncodingProvider 不会给你每个编码,而只会给你额外的编码(例如,你不会得到 ISO-8859-1 代码页,因为 CodePagesEncodingProvider.Instance.GetEncoding(28591) 返回 null)。 - stb
在 .NET 6 上的 Azure Functions 中,这行代码会抛出异常 FileNotFoundException: Could not load file or assembly 'System.Threading, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified.。似乎没有人遇到过这个问题。有什么想法吗? - Tom W
另一种(稍微长一点)的方法是使用GetEncoding()重载的名称:Encoding encodingByName = Encoding.GetEncoding("Windows-1252"); - undefined

16
请编写:
<ItemGroup>
    <PackageReference Include="System.Text.Encoding.CodePages" Version="4.3.0" />
</ItemGroup>

在 csproj 文件中。

在包控制台中输入 'dotnet restore',以还原程序集。

以下是示例代码:

public class MyClass
{
    static MyClass()
    {
        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    }
}

1
这个问题的NET CORE版本是1.0(从日期上可以看出),这个答案不起作用。 - Joshua
我知道这是错误的版本(这在1.1版中对我有效,但它非常好用。谢谢朋友。) - Eric
1
我认为有必要加上一句话,即如果您的编码以静态只读字段或静态常量存储在同一个类中,则静态构造函数将无法工作。当访问该字段时,它不会按时执行。解决此问题的一种方法是使用 Lambda 属性:public static Encoding Windows1252 => Encoding.GetEncoding(1252); - masterwok
1
@masterwok:你不能将其中之一存储在“const”中,如果你想要它在“static readonly”中,你可以在静态构造函数中初始化它而不是内联。 - Joshua

3

这里是关于CodePagesEncodingProvider的注释:

Windows桌面的.NET Framework支持大量的Unicode和代码页编码,而.NET Core只支持以下编码: - ASCII(代码页20127),由Encoding.ASCII属性返回。 - ISO-8859-1(代码页28591)。 - UTF-7(代码页65000),由Encoding.UTF7属性返回。 - UTF-8(代码页65001),由Encoding.UTF8属性返回。 - UTF-16和UTF-16LE(代码页1200),由Encoding.Unicode属性返回。 - UTF-16BE(代码页1201),通过使用bigEndian值为true调用UnicodeEncoding.UnicodeEncoding或UnicodeEncoding.UnicodeEncoding构造函数来实例化。 - UTF-32和UTF-32LE(代码页12000),由Encoding.UTF32属性返回。 - UTF-32BE(代码页12001),通过调用具有bigEndian参数的UTF32Encoding构造函数并在方法调用中提供true值来实例化。
除了代码页20127之外,不支持其他代码页编码。 CodePagesEncodingProvider类扩展了EncodingProvider,使这些代码页可用于.NET Core。 因此,您需要首先注册编码提供程序才能使用其他编码,如Windows-1252
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

CodePagesEncodingProvider 提供了一个编码提供程序,用于访问在桌面 .NET Framework 中才可用的代码页。

之后,您还可以找到更多的编码,并且可以获取 Windows-1252

Encoding win1252 = Encoding.GetEncoding(1252);

请注意,您需要引用 System.Text.Encoding.CodePages.dll 才能在某些 .net 版本中使用 CodePagesEncodingProvider。您需要将 nuget package 添加到您的项目中。
Install-Package System.Text.Encoding.CodePages

晚了,冗长而且没有为现有答案增添任何内容。 - Joshua

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