首页 > Web开发 > 详细

难道.NET Core R2连中文编码都不支持吗?

时间:2016-05-18 23:57:30      阅读:598      评论:0      收藏:0      [点我收藏+]

今天写了一个简单的.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: }

再次执行我们的程序后一切正常。

技术分享

难道.NET Core R2连中文编码都不支持吗?

原文:http://www.cnblogs.com/artech/p/encoding-registeration-4-net-core.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!