System.NotSupportedException: нет данных для кодировки 1252

Я работаю с Учебным пособием по коммерции Trust о том, как создать токен оплаты, который позволит клиентам использовать форму оплаты TC Trustee Host. Мне дали пример того, как получить этот токен командой разработчиков.

using System;
using System.Net;
using System.IO;
using System.Text;
using System.Collections;
using System.Web;

/** @class TCToken
 * An example class for generating a TrustCommerce Trustee Token
 */
public class TCToken
{

    public static void Main(string [] args)
    {
        string custid = "123456";
        string password = "XXXXXX";
        try {
            // Adapted from http://www.west-wind.com/presentations/dotnetWebRequest/dotnetWebRequest.htm
            string gateway_post_address = "https://vault.trustcommerce.com/trustee/token.php";
            HttpWebRequest req = (HttpWebRequest) WebRequest.Create(gateway_post_address);

            // A sixty second timeout.
            req.Timeout = 60000;

            string post_data = "custid=" + HttpUtility.UrlEncode(custid) +
                                "&password=" + HttpUtility.UrlEncode(password);

            req.Method = "POST";
            byte [] buf = System.Text.Encoding.GetEncoding(1252).GetBytes(post_data);
            req.ContentLength = buf.Length;
            req.ContentType = "application/x-www-form-urlencoded";

            Stream s = req.GetRequestStream();
            s.Write(buf, 0, buf.Length);
            s.Close();

            HttpWebResponse rep = (HttpWebResponse) req.GetResponse();
            Encoding enc = System.Text.Encoding.GetEncoding(1252);
            StreamReader rs = new StreamReader(rep.GetResponseStream(), enc);

            string token = rs.ReadToEnd();

            Console.WriteLine(token);

            rep.Close();
            rs.Close();
        } catch (Exception e) {
            Console.WriteLine(e);
        }
    }
}

Я создал новое консольное приложение в Visual Studio, скопировал этот код и заменил имя пользователя и пароль правильными учетными данными. Когда я пытаюсь запустить это, я получаю следующую ошибку в консоли.

System.NotSupportedException: нет данных, доступных для кодировки 1252. Информацию об определении пользовательской кодировки см. В документации по методу Encoding.RegisterProvider. в System.Text.Encoding.GetEncoding(кодовая страница Int32) в TCToken.Program.Main(аргументы String[]) в C:\Users\xxxx\source\repos\TCToken\TCToken\Program.cs: строка 29

Я пытался погуглить эту ошибку, и большинство ответов немного выше моего понимания. Я, конечно, не эксперт по C#.

7 ответов

Решение

.NET Core поддерживает только кодировки ASCII, ISO-8859-1 и Unicode, тогда как.NET Framework поддерживает гораздо больше.

Однако.NET Core можно расширить для поддержки дополнительных кодировок, таких как Windows-1252, Shift-JIS, GB2312, зарегистрировав CodePagesEncodingProvider из https://www.nuget.org/packages/System.Text.Encoding.CodePages/.

После установки пакета NuGet необходимо выполнить следующие шаги, как описано в документации для класса CodePagesEncodingProvider, для регистрации поставщика:

  1. Добавьте ссылку на сборку System.Text.Encoding.CodePages.dll в свой проект.
  2. Получите объект CodePagesEncodingProvider из статического свойства Instance.
  3. Передайте объект CodePagesEncodingProvider в метод Encoding.RegisterProvider.

Что сказал ckuri. Для ясности: перед открытием потока вам понадобится следующая строка кода (шаги 2,3):

System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

nuget:
Install-Package System.Text.Encoding.CodePages -Version 5.0.0

код:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

Решение:

  1. ДобавитьSystem.Text.Encoding.CodePagesПакет для вашего проекта.

  2. Напишите этот код в своей программе:

             System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
    

У меня возникла аналогичная проблема, когда я пытался прочитать и преобразовать файл xlsx в DataTable. Я обнаружил, что кодировка 1252 не используется по умолчанию в .NET Core, поэтому мне пришлось отдельно добавить пакет NuGet для нее.

Ниже приведен метод преобразования данных из потока памяти.

      private static DataTableCollection ExcelToDataTable(MemoryStream stream)
{
    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

    using (var reader = ExcelReaderFactory.CreateReader(stream))
    {
        var result = reader.AsDataSet(new ExcelDataSetConfiguration()
        {
            ConfigureDataTable = (data) => new ExcelDataTableConfiguration()
            {
                UseHeaderRow = true
            }
        });
        
        return result.Tables;
    }
}

Я сослался на кодировщик из пакета nuGet в начале метода, и он отлично сработал для меня. Этот ответ запоздалый, но может помочь людям, которые читают данные из потоков.

      System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

Я установил библиотеку System.Text.Encoding.CodePages, как говорилось в других сообщениях, и этот код работал у меня:

      System.Text.Encoding.RegisterProvider(
    System.Text.CodePagesEncodingProvider.Instance);
Encoding srcEncoding = Encoding.GetEncoding(1251);
using (var reader = new StreamReader(@"D:\someFile.csv", encoding: srcEncoding))
{
    List<string> listA = new List<string>();                
    while (!reader.EndOfStream)
    {
         var line = reader.ReadLine();
         var values = line.Split(';');
         listA.Add(values[0]);                    
    }
}

Это решение работает для меня:

      System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

на что указал dawidg( user482649).

однако я заметил, что когда я использую Entity Framework Core 6.0.5 с ExecuteSqlRaw, это также исправляет ошибку.

      using (DbContext db = new())
{
    db.Database.ExecuteSqlRaw(";");
}

После этого ошибка также исчезает. Это весело, но это работает.

Другие вопросы по тегам