.NET Core weiß nichts über Windows 1252, wie man das behebt?


77

Dieses Programm funktioniert einwandfrei, wenn es für .NET 4 kompiliert wurde, jedoch nicht, wenn es für .NET Core kompiliert wurde. Ich verstehe den Fehler bezüglich der Codierung nicht unterstützt, aber nicht, wie man ihn behebt.

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

C # ist hier ein Artefakt von MCV; Das Tag gehört nicht dazu.
Joshua

c # ist die Sprache, die in Antworten und Fragen verwendet wird. Ich gehöre hierher. Auch die Syntaxhervorhebung ist ohne sie unterbrochen und die am häufigsten verwendete Sprache der .NET-Plattform.
Vadim Ovchinnikov

@VadimOvchinnikov: Ich denke, ich würde den Code lieber so umschreiben, dass er in VB .NET enthalten ist, wie er wirklich war. Ich habe es damals nicht getan, weil ich mich nicht mit Leuten befassen wollte, die nur behaupteten, VB .NET sei es nicht wird unterstützt, wenn der Compiler tatsächlich einwandfrei funktioniert hat. Ich müsste nur eine Projektdatei zehnmal länger als den Code hochladen.
Joshua

Dies ist keine echte Lösung, da dadurch der Code in der Frage geändert wird. Wenn der Grund für die Verwendung der Codepage 1252 darin besteht, Zeichen von ISO-8859-1 zu lesen / schreiben, kann man sie durch 28591 ersetzen, das in .NET Core enthalten ist, ohne ein CodePages- Paket hinzuzufügen : docs.microsoft.com/en-us/dotnet / api / ... beachten Sie, dass einige Zeichen über ISO-8859-1are anders in Codepage 1252 en.wikipedia.org/wiki/ISO/IEC_8859-1#Windows-1252 , vor allem der Euro - Zeichen (€).
Stb

Antworten:


147

Dazu müssen Sie die Instanz aus dem Paket registrieren .CodePagesEncodingProviderSystem.Text.Encoding.CodePages

Installieren Sie dazu das Paket System.Text.Encoding.CodePages :

dotnet add package System.Text.Encoding.CodePages

Dann können Sie (nach implizitem oder explizitem Ausführen dotnet restore) Folgendes aufrufen:

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

Wenn Sie nur diese eine Codepage benötigen, können Sie sie auch ohne Registrierung direkt abrufen:

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

1
Wo soll ich installieren oder wo soll ich das ausführen dotnet add package System.Text.Encoding.CodePages?
Rich

1
@Rich Du solltest es aus dem Verzeichnis mit deinem ausführen csproj. Wenn Sie Visual Studio verwenden, können Sie anstelle dieses Befehls auch den Paket-Manager verwenden.
Svick

Klappt wunderbar ! Vielen Dank für diesen Lebensretter!
Felipe de Macêdo

Das Obige hilft bei .NET Core 2.0+ für einige bestimmte Codierungseigenschaften wie HeaderName nicht. Dies wird immer noch werfen NotSupportedException.
Alex

Übrigens: Man sollte nicht CodePagesEncodingProvider.Instance.GetEncodingmit einer variablen Eingabe verwenden. docs.microsoft.com/en-us/dotnet/api/… sagt: "Sie sollten die EncodingProvider.GetEncoding-Überladungen nicht aufrufen." Grund könnte sein , dass EncodingProviderSie nicht jede Codierung geben, aber wahrscheinlich nur zusätzliche Codierungen (zB Sie nicht ISO-8859-1 Zeichensatz erhalten , wie CodePagesEncodingProvider.Instance.GetEncoding(28591)gibt null).
Stb

11

Bitte schreibe:

<ItemGroup>
    <PackageReference Include="System.Text.Encoding.CodePages" Version="4.3.0" />
</ItemGroup>

in csproj.

Schreiben Sie in der Paketkonsole 'dotnet restore' und stellen Sie Assemblys wieder her.

und mit diesem Code als Beispiel:

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

1
Die NET CORE-Version für diese Frage ist 1.0 (wie ab dem Datum ersichtlich sein sollte). Diese Antwort funktioniert nicht.
Joshua

Ich weiß, dass es die falsche Version war (dies funktionierte für mich in 1.1, aber es funktionierte wie ein Zauber. Gracias amigo.
Eric

1
Ich denke, es ist wichtig hinzuzufügen, dass der statische Konstruktor nicht funktioniert, wenn Ihre Codierung als statisches schreibgeschütztes Feld oder statische Konstante in derselben Klasse gespeichert ist. Es wird nicht rechtzeitig ausgeführt, wenn auf das Feld zugegriffen wird. Eine Möglichkeit, dies zu public static Encoding Windows1252 => Encoding.GetEncoding(1252);
umgehen,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.