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