今天写了一个简单的.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. 应用工具 .NET Portability Analyzer 分析迁移dotnet core

    大多数开发人员更喜欢一次性编写好业务逻辑代码,以后再重用这些代码.与构建不同的应用以面向多个平台相比,这种方法更加容易.如果您创建与 .NET Core 兼容的.NET 标准库,那么现在比以往任何时候 ...

  2. 干货分享:SQLSERVER使用裸设备

    干货分享:SQLSERVER使用裸设备 这篇文章也适合ORACLE DBA和MYSQL DBA 阅读 裸设备适用于Linux和Windows 在ORACLE和MYSQL里也是支持裸设备的!! 介绍 大 ...

  3. C++中的变长参数

    新参与的项目中,为了使用共享内存和自定义内存池,我们自己定义了MemNew函数,且在函数内部对于非pod类型自动执行构造函数.在需要的地方调用自定义的MemNew函数.这样就带来一个问题,使用stl的 ...

  4. SSH实战 · 唯唯乐购项目(下)

    后台模块 一:后台用户模块 引入后台管理页面 创建adminuser表: CREATE TABLE `adminuser` (   `uid` int(11) NOT NULL AUTO_INCREM ...

  5. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  6. 运用php做投票题,例题

    要求大概是这样的,有一个题目,题目下面是复选框,要求点完复选框提交后会变成进度条,各选项的进度条百分比,和投票数量 首先还是要在数据库建两张表,如下: 要完成这个题目,需要建两个页面 <!DOC ...

  7. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  8. [.NET] 怎样使用 async & await 一步步将同步代码转换为异步编程

    怎样使用 async & await 一步步将同步代码转换为异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6079707.html  ...

  9. bootstrap-fileinput 简单使用

    bootstrap-fileinput 是一款图片/文件上传 bootstrap 插件,简单示例代码: <!DOCTYPE html> <html> <head> ...

  10. .NET应用和AEAI CAS集成详解

    1 概述 数通畅联某综合SOA集成项目的统一身份认证工作,需要第三方系统配合进行单点登录的配置改造,在项目中有需要进行单点登录配置的.NET应用系统,本文专门记录.NET应用和AEAI CAS的集成过 ...