.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
Joshua
quelle
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);
svick
quelle
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);
    }
}
svick
quelle
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,