今天写了一个简单的.NET Core RC2控制台程序,发现中文显示一直是乱码。查看操作系统设置,没有问题;查看源文件编码,也没有问题;甚至查看了Console字符编码相关的注册表,依然没有发现问题。难道NET Core到了RC2,莫非连一些常用的编码都不支持吗?
现在给大家重现这个问题,通过VS 2015创建一个.NET Core控制台程序。
我们在Main方法中只编写了如下几行行程序,将输入的字符串直接打印出来。
using System; namespace App { public class Program { public static void Main(string[] args) { while (true) { Console.WriteLine(Console.ReadLine()); } } } }
运行程序并分别输入中文和英文,我们会发现输入的中文显示为乱码。
为了进一步证明.NET Core对编码的局限,我们按照如下的方式调用Encoding的GetEncoding方法分别获取两种中文编码:GB2312和CP936。
using System; using System.Text; namespace App { public class Program { public static void Main(string[] args) { try { Console.WriteLine(Encoding.GetEncoding(936)); } catch (Exception ex) { Console.WriteLine(ex.Message); } try { Console.WriteLine(Encoding.GetEncoding("GB2312")); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }
程序执行结果证明,上述两种中文编码均不支持。
我们提供的两种中文编码在默认情况下都不支持,是因为默然情况下它们的EncodingProvider没有注册。上面显示的错误消息其实也提到了这几点,并且提到一个用于注册EncodingProvider的方法(Encoding.RegisterProvider)。于是我们按照下面的方式注册一个CodePageEncodingProvider。
using System; using System.Text; namespace App { public class Program { public static void Main(string[] args) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Console.WriteLine(Encoding.GetEncoding(936)); Console.WriteLine(Encoding.GetEncoding("GB2312")); while (true) { Console.WriteLine(Console.ReadLine()); } } } }
CodePageEncodingProvider定义在NuGet包“System.Text.Encoding.CodePages”之中,所以我们需要现在Project.json文件中按照如下的方式注册对应的依赖。
{ ... "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0-rc2-3002702" }, "System.Text.Encoding.CodePages": "4.0.1-rc2-24027" }, ... }
再次执行我们的程序后一切正常。