.NET Core不了解Windows 1252,如何解决?


77

当为.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

C#是MCV的产物。标签不属于。
约书亚

C#是答案和问题中使用的语言。我确实属于这里。如果没有它,语法高亮也会被破坏,它是.NET平台最常用的语言。
Vadim Ovchinnikov '18

@VadimOvchinnikov:我想我宁愿重写代码到VB .NET中,这也是它的真正含义。当时我没有,因为我不想和那些声称VB .NET不是的人打交道。实际上支持编译器工作正常的情况。我只需要上载比代码长十倍的项目文件。
约书亚

这不是真正的解决方法,因为它会更改问题中的代码。但是,如果使用代码页1252的原因是读/写ISO-8859-1字符,则可以将其替换为.NET Core中包含的28591,而无需添加CodePages程序包: docs.microsoft.com/zh-cn/dotnet / api /… 请注意,ISO-8859-1之外的某些字符在代码页1252 en.wikipedia.org/wiki/ISO/IEC_8859-1#Windows-1252中有所不同,尤其是欧元符号(€)。
stb

Answers:


146

要做到这一点,你需要注册CodePagesEncodingProvider从实例System.Text.Encoding.CodePages包。

为此,请安装System.Text.Encoding.CodePages包

dotnet add package System.Text.Encoding.CodePages

然后(隐式或显式运行后dotnet restore),您可以调用:

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var enc1252 = Encoding.GetEncoding(1252);

另外,如果只需要一个代码页,则无需注册即可直接获取:

var enc1252 = CodePagesEncodingProvider.Instance.GetEncoding(1252);

1
我应该在哪里安装目录dotnet add package System.Text.Encoding.CodePages
Rich

1
@Rich您应该使用来从目录运行它csproj。如果使用的是Visual Studio,则还可以使用“程序包管理器”代替该命令。
svick

奇迹般有效 !谢谢您的救命!
费利佩·德·马西多

上面对于某些特定的Encoding属性(如HeaderName)在.NET Core 2.0+上无济于事。这仍然会抛出NotSupportedException
亚历克斯

顺便说一句:不应CodePagesEncodingProvider.Instance.GetEncoding与变量输入一起使用。 docs.microsoft.com/zh-cn/dotnet/api/…说:“您不应调用EncodingProvider.GetEncoding重载”。原因可能是EncodingProvider不会提供所有编码,但可能只会提供其他编码(例如,您不会像CodePagesEncodingProvider.Instance.GetEncoding(28591)给出的那样获得ISO-8859-1代码页null)。
stb

11

请写出:

<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(从日期开始应该是显而易见的);这个答案不起作用。
约书亚

我知道这是错误的版本(这在1.1为我工作,但它的工作像一个魅力格拉西亚斯AMIGO。
埃里克·

1
我认为重要的一点是,如果您的编码存储为同一类上的静态只读字段或静态const,则静态构造函数将无法工作。访问该字段时不会及时执行。解决此问题的一种方法是使用lambda属性:public static Encoding Windows1252 => Encoding.GetEncoding(1252);
masterwok
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.