.NET Core 调用 Encoding.GetEncoding() 挂起

f0r*_*0rt 1 .net .net-core

我打电话给下面的线路。呼叫无限挂起。

Encoding.GetEncoding(1251);
Encoding.GetEncoding("Windows-1251");
Run Code Online (Sandbox Code Playgroud)

我正在使用:

  • VS 2017 15.7.2
  • dotnet --version > "2.1.201"
  • 视窗 10

Pan*_*vos 5

该方法不会阻塞。很可能它会抛出异常,其余的代码以一种使代码看起来像是阻塞的方式处理异常。也许有一个catch {}地方

来自 .NET 中的字符编码中的 .NET Core 注释

默认情况下,.NET Core 不提供除代码页 28591 和 Unicode 编码之外的任何代码页编码,例如 UTF-8 和 UTF-16。但是,您可以将在面向 .NET 的标准 Windows 应用中找到的代码页编码添加到您的应用中。有关完整信息,请参阅CodePagesEncodingProvider主题。

并不奇怪,因为 .NET 和 Windows 已经使用 UTF16,并且几乎所有网站、REST API、文件都使用 UTF8。

如果您尝试一个简单的控制台应用程序:

static void Main(string[] args)
{
    var enc=Encoding.GetEncoding(1251);
    Console.WriteLine(enc);
    Console.WriteLine("Hello World!");
}
Run Code Online (Sandbox Code Playgroud)

你会得到一个例外:

Unhandled Exception: System.NotSupportedException: No data is available for encoding 1251. 
For information on defining a custom encoding, see the documentation for the 
Encoding.RegisterProvider method.
   at System.Text.Encoding.GetEncoding(Int32 codepage)
   at encodingtest.Program.Main(String[] args) in H:\Projects\encodingtest\Program.cs:line 11
Run Code Online (Sandbox Code Playgroud)

您可以通过添加System.Text.Encoding.CodePages包并注册它来安装其他代码页:

static void Main(string[] args)
{
   Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
   var enc=Encoding.GetEncoding(1251);
   Console.WriteLine(enc);
   Console.WriteLine("Hello World!");
}
Run Code Online (Sandbox Code Playgroud)

这次应用程序不会抛出。