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


    今天写了一个简单的.NET Core RC2控制台程序,发现中文显示一直是乱码。查看操作系统设置,没有问题;查看源文件编码,也没有问题;甚至查看了Console字符编码相关的注册表,依然没有发现问题。难道NET Core到了RC2,莫非连一些常用的编码都不支持吗?

    现在给大家重现这个问题,通过VS 2015创建一个.NET Core控制台程序。

    image

    我们在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: }

    运行程序并分别输入中文和英文,我们会发现输入的中文显示为乱码。

    image

    为了进一步证明.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: }

    程序执行结果证明,上述两种中文编码均不支持。

    image

    我们提供的两种中文编码在默认情况下都不支持,是因为默然情况下它们的EncodingProvider没有注册。上面显示的错误消息其实也提到了这一点,并且提到一个用于注册EncodingProvider的方法(Encoding.RegisterProvider)。于是我们按照下面的方式注册一个CodePagesEncodingProvider。

       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: }

    CodePagesEncodingProvider定义在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: }

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

    image

    这个小问题其实体现了.NET Core最大的一个设计原则,那就是真正的模块化。对于.NET Framework来说,基础类型和API基本上通过几个核心的程序集来承载(比如mscorlib.dll,System.dll、System.Core.dll等),也就是在部署的时候,这些个程序集都是必需的——可能我们只使用到其中很少的API。这样的设计对于桌面应用,没有什么问题,现在.NET Core要实现真正的跨平台,并且创建适合多种设备的统一应用(UWP),这样的部署方式就有问题了。所有.NET Core将很多“不那么核心”的API分离出来定义在其他的程序集中,并通过相应的NuGet包来承载。那么我们的应用就可以“按需使用”这些NuGet包了。这是一种“pay-for-play”设计。

  • 相关阅读:
    routine的加载
    Forms Authentication and Role based Authorization: A Quicker, Simpler, and Correct Approach
    How does Request.IsAuthenticated work?
    细说ASP.NET Forms身份认证
    IIS URL Rewriting and ASP.NET Routing
    Razor syntax reference for ASP.NET Core
    win10 合并磁盘 disk Acronis Disk Director
    bad object refs/remotes/origin/HEAD
    https://www.atlassian.com/git/tutorials/git-gc
    c++ 中文字符串处理方法
  • 原文地址:https://www.cnblogs.com/artech/p/encoding-registeration-4-net-core.html
Copyright © 2020-2023  润新知