.NET Core не знає про Windows 1252, як це виправити?


81

Ця програма чудово працює при компіляції для .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.
Вадим Овчинников

@VadimOvchinnikov: Я думаю, що я б скоріше переписав код, щоб він був у VB .NET, який він був насправді. Я тоді цього не робив, тому що не хотів мати справу з людьми, які просто стверджували, що VB .NET не є підтримується, коли насправді компілятор працював чудово. Мені просто потрібно завантажити файл проекту в десять разів довший за код.
Джошуа

Це не справжнє виправлення, оскільки воно змінює код у питанні. Але якщо причиною використання кодової сторінки 1252 є читання / запис символів ISO-8859-1, тоді можна замінити його на 28591, який входить до складу .NET Core, не додаючи пакет CodePages : docs.microsoft.com/en-us/dotnet / api /… Майте на увазі, що деякі символи за межами ISO-8859-1 відрізняються на кодовій сторінці 1252 en.wikipedia.org/wiki/ISO/IEC_8859-1#Windows-1252 , особливо знак Євро (€).
stb

Відповіді:


157

Для цього вам необхідно зареєструватися на 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?
Багатий

1
@Rich Вам слід запустити його з каталогу за допомогою вашого csproj. Якщо ви використовуєте Visual Studio, ви також можете використовувати диспетчер пакетів замість цієї команди.
свик

Працює як шарм! Дякуємо за цей порятунок життя!
Феліпе де Македо

Вищевказане не допоможе в .NET Core 2.0+ для деяких конкретних властивостей кодування, таких як HeaderName. Це все одно кине NotSupportedException.
Алекс

BTW: Не слід використовувати CodePagesEncodingProvider.Instance.GetEncodingзі змінним входом. docs.microsoft.com/en-us/dotnet/api/… говорить: "ви не повинні викликати EncodingProvider.GetEncoding перевантаження". Причиною може бути те EncodingProvider, що не даватиме вам кожного кодування, а, можливо, лише додаткові кодування (наприклад, ви не отримаєте кодову сторінку ISO-8859-1, як це CodePagesEncodingProvider.Instance.GetEncoding(28591)дає null).
stb

11

Будь-ласка напишіть:

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

у csproj.

У консолі пакета напишіть «відновлення dotnet», відновіть збірки.

і вкажіть цей код для зразка:

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

1
Версія NET CORE для цього питання становить 1,0 (що повинно бути очевидно з дати); ця відповідь не працює.
Джошуа

Я знаю, що це була неправильна версія (це спрацювало для мене в 1.1, але це спрацювало як шарм. Gracias amigo.
Ерік,

1
Думаю, важливо додати, що статичний конструктор не буде працювати, якщо ваше кодування зберігається як статичне поле лише для читання або статичний const того самого класу. Він не буде виконаний вчасно при доступі до поля. Один із способів обійти це використання лямбда-властивості:public static Encoding Windows1252 => Encoding.GetEncoding(1252);
masterwok
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.