【问题标题】:System.NotSupportedException: No data is available for encoding 1252System.NotSupportedException:没有数据可用于编码 1252
【发布时间】:2018-06-14 13:01:23
【问题描述】:

我正在与Trust Commerce Tutorial 合作,了解如何生成允许客户使用 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[] args) 在 C:\Users\xxxx\source\repos\TCToken\TCToken\Program.cs:29 行

我尝试用谷歌搜索这个错误,大多数回复都超出了我的理解。我当然不是 C# 专家。

【问题讨论】:

  • 您的控制台使用的是 .NET Framework 还是 .NET Core?我认为在核心上你需要安装System.Text.Encoding.CodePages NuGet package
  • .NET Core 2.0 我确实通过 nuget 安装了该软件包并重建了我的解决方案。我遇到了同样的错误。
  • 我忘记了您需要按照msdn.microsoft.com/en-us/library/…中所述的三个步骤进行操作
  • 如果真的不需要1252编码,那就用UTF8
  • @ckuri 做到了!

标签: c#


【解决方案1】:

.NET Core 仅支持 ASCII、ISO-8859-1 和 Unicode 编码,而 .NET Framework 支持更多。

但是,通过从 System.Text.Encoding.CodePages NuGet package 注册 CodePagesEncodingProvider,可以扩展 .NET Core 以支持其他编码,例如 Windows-1252、Shift-JIS、GB2312。

安装 NuGet 包后,必须按照CodePagesEncodingProvider class 文档中所述的以下步骤来注册提供程序:

  1. 向您的项目添加对 System.Text.Encoding.CodePages.dll 程序集的引用。
  2. 从静态 Instance 属性中检索 CodePagesEncodingProvider 对象。
  3. 将 CodePagesEncodingProvider 对象传递给 Encoding.RegisterProvider 方法。

【讨论】:

  • Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);这就是添加对代码的引用的方式
  • 感谢您提及用于 .NET Core 应用程序的正确库。仅供参考 - 下面 dawidg 的答案消除了专门引用 .dll 程序集的需要。
【解决方案2】:

ckuri 说了什么。为了清楚起见,在打开流之前需要以下代码行(步骤 2,3):

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

ExcelDataReader - Important note on .NET Core

默认情况下,ExcelDataReader 会抛出 NotSupportedException “没有数据 可用于编码 1252。”在 .NET Core 上。

要解决此问题,请将依赖项添加到包 System.Text.Encoding.CodePages 然后添加代码以在期间注册代码页提供程序 应用程序初始化(Startup.cs 中的 f.ex):

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

这是解析二进制 BIFF2-5 Excel 文档中的字符串所必需的 用 DOS 时代的代码页编码。这些编码由 默认在完整的 .NET Framework 中,但不是在 .NET Core 中。

【讨论】:

    【解决方案3】:

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

    代码:
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

    【讨论】:

    • 我是为了报错信息而来的,为了这两行代码我留下了。剩下的只是闲聊。这是对我有用的答案。太棒了!!!
    • @david.pfx - 你是 stackoverflow 复制和粘贴哲学的真正大师,你不在乎为什么会出现问题,只需给我复制和粘贴的代码 - 任务完成
    【解决方案4】:

    我在尝试读取 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);
    

    【讨论】:

      【解决方案5】:

      我说我已经安装了the library System.Text.Encoding.CodePages like other posts,这段代码对我有用:

      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]);                    
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-19
        • 2016-10-13
        • 1970-01-01
        • 2018-11-08
        • 2020-01-22
        • 1970-01-01
        • 2018-01-13
        相关资源
        最近更新 更多