今天写了一个简单的.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)。于是我们按照下面的方式注册一个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: }

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

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

难道.NET Core到R2连中文编码都不支持吗?的更多相关文章

  1. 交叉编译环境的linaro-gdb可以用了,结果打开core文件,显示堆栈都是??

    交叉编译环境的linaro-gdb可以用了,结果打开core文件,显示堆栈都是?? aarch64-linux-gun-gdb ./test core warning: /lib/libpthread ...

  2. Windows Forms和WPF在Net Core 3.0框架下并不会支持跨平台

    Windows Forms和WPF在Net Core 3.0框架下并不会支持跨平台 微软将WinForms和WPF带到.NET Core 3.0这一事实,相信大家都有所了解,这是否意味着它在Linux ...

  3. ASP.NET Core 6.0对热重载的支持

    .NET 热重载技术支持将代码更改(包括对样式表的更改)实时应用到正在运行的程序中,不需要重启应用,也不会丢失应用状态. 一.整体介绍 目前 ASP.NET Core 6.0 项目都支持热重载.在以下 ...

  4. SQL Server 2008, 2008 R2, 2012 and 2014 完全支持TLS1.2加密传输

    SQL Server 2008, 2008 R2, 2012 and 2014 完全支持TLS1.2加密传输 微软高兴地宣布所有主流SQL Server客户端驱动和SQL Server发行版已经支持T ...

  5. 让VC2012生成的程序支持XP系统(QT的DLL都是支持XP的,只与EXE有关)

    如果用的编译器是VC2012以上,那么默认生成出的程序是不能运行在XP系统上的.所以需要修改链接参数 我们要做的是修改qmake.conf文件中的参数,文件路径根据开发环境不同而不同下面以5.1.1 ...

  6. 让VC2012生成的程序支持XP系统(修改mkspecs\win32-msvc2012\qmake.conf,QT的DLL都是支持XP的,只与EXE有关)good

    如果用的编译器是VC2012以上,那么默认生成出的程序是不能运行在XP系统上的.所以需要修改链接参数 我们要做的是修改qmake.conf文件中的参数,文件路径根据开发环境不同而不同下面以5.1.1 ...

  7. VS2010对C++11的支持列表(感觉大部分都不支持)

    c++11,就是之前的c++0x,已经成为了最新的c++标准.像咱这样天天用c++的,就赶紧follow一下.学习成果,放在这里,不说分享,至少自己增强下记忆. 首先,给出一些有用的链接. http: ...

  8. HTTP客户端都应该支持的五个特性

    在我看来,HTTP客户端必须要支持如下五个特性. 缓存 最后修改时间的检查 ETags 压缩 重定向 缓存返回的头如下: Cache-Control: max-age=, public Expires ...

  9. Asp.Net Core WebAPI中启用XML格式数据支持

    因为XML是一种非常常用的数据格式,所以Asp.Net core提供了非常便利的方式来添加对XML格式的支持 只需要在IOC注册Controller服务的后面跟上.AddXmlDataContract ...

随机推荐

  1. 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡

    一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务 ...

  2. Python标准模块--Unicode

    1 模块简介 Python 3中最大的变化之一就是删除了Unicode类型.在Python 2中,有str类型和unicode类型,例如, Python 2.7.6 (default, Oct 26 ...

  3. Oracle Database 12c Data Redaction介绍

    什么是Data Redaction Data Redaction是Oracle Database 12c的高级安全选项之中的一个新功能,Oracle中国在介绍这个功能的时候,翻译为“数据编纂”,在EM ...

  4. Ajax使用WCF实现小票pos机打印源码

    通过ajax跨域方式调用WCF服务,实现小票pos机的打印,源码提供web方式,客户端方式测试,服务驻留右侧底部任务栏,可控制服务开启暂停,用户可自定义小票打印模板,配合零售录入. qq  22945 ...

  5. Spring获取ApplicationContext

    在Spring+Struts+Hibernate中,有时需要使用到Spring上下文.项目启动时,会自动根据applicationContext配置文件初始化上下文,可以使用ApplicationCo ...

  6. java面向对象中的关键字

    1,super关键字 super:父类的意思 1. super.属性名 (调用父类的属性) 2. super.方法名 (调用父类的方法) 3. super([参数列表])(调用父类的构造方法) 注意: ...

  7. 报错:You need to use a Theme.AppCompat theme (or descendant) with this activity.

    学习 Activity 生命周期时希望通过 Dialog 主题测试 onPause() 和 onStop() 的区别,点击按钮跳转 Activity 时报错: E/AndroidRuntime: FA ...

  8. 编译器开发系列--Ocelot语言3.类型名称的消解

    "类型名称的消解"即类型的消解.类型名称由TypeRef 对象表示,类型由Type 对象表示.类型名称的消解就是将TypeRef 对象转换为Type 对象. TypeResolve ...

  9. CentOS Mono Nginx 部署 MVC4+WebApi

    CentOS Mono Nginx 部署 MVC4+WebApi 经过几天的折磨,终于在CentOS上成功部署了MVC4+WebApi.Mono上的服务器推荐两种:Jexus(国产高人写的一款很牛的服 ...

  10. 面向组合子设计Coder

    面向组合子 面向组合子(Combanitor-Oriented),是最近帮我打开新世界大门的一种pattern.缘起haskell,又见monad与ParseC,终于ajoo前辈的几篇文章. 自去年9 ...