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

今天写了一个简单的.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:             
  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:     "":  "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”设计。

作者:蒋金楠
微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文链接

时间: 2025-01-21 09:55:22

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

目前在淘宝网销售的货币基金都无法支持T+0 赎回

11月1日上午9时,第一批17家基金淘宝店正式开张. 华夏.嘉实.南方.广发.易方达.工银瑞信等十多家基金公司的店铺正式在淘宝理财亮相.此外,天弘.华安.大成.博时等基金公司的淘宝店铺正在装修中,预计近期将陆续上线. 主打固定收益产品 10月31日晚间,淘宝网方面表示,根据<证券投资基金销售机构通过第三方电子商务平台开展业务管理暂行规定>,淘宝网正式获得证监会出具的无异议函,获准销售基金.此前,多家基金公司淘宝开店事宜已经准备就绪,只等待淘宝网得到证监会的批文. 淘宝网并未直接取得基金销售牌照

联发科谢清江:2015年预计国内七成以上智能手机出货都将支持4G

摘要: 联发科总经理谢清江近日在接受<壹观察>专访时表示,2015年预计国内七成以上智能手机出货都将支持4G,联发科64位六模芯片将于第二季度规模出货.针对联发科与小米合作中止的传 联发科总经理谢清江近日在接受<壹观察>专访时表示,2015年预计国内七成以上智能手机出货都将支持4G,联发科64位六模芯片将于第二季度规模出货.针对联发科与小米合作中止的传闻,谢清江明确回应表示:"联发科与小米的合作肯定在继续,新品正在研发阶段,所谓传闻消息是谣言". 2015年是国

mono都可以支持webform跨平台, .net core 为什么不支持。。。

问题描述 毕竟webform有自己特有的优势啊.在后台管理数据方面,几个控件就搞定了.说如果webform引用了什么dll不方便跨平台,微软为什么不略微改造一下,而是直接抛弃, 解决方案 解决方案二:因为它运行依赖iis,而iis完全跟windows绑定的解决方案三:而且asp.netcore没说webform没有了啊,只是都合到一起了解决方案四:我觉得归根结底是WebForm技术已经不符合潮流了.WebForm非常依赖服务器端处理,虽然后期有UpdatePanel,但是本质上还是严重依赖服务器

自家应用都不支持WP系统 微软移动策略让股东怒了

北京时间12月2日消息,据外媒报道,在11月30日举行的年度股东大会上,微软股东提出了许多关于Windows Phone未来发展策略的问题.有股东抱怨称,微软自己开发的应用不首先支持Windows Phone系统,反而率先登陆Android.OS平台. "请不要讨论与Windows Phone以及其它设备相关的任何内容,"这就是微软股东大会的开场白.如果换作其它场合,这句话可能听起来很好笑.但这是在微软股东大会上,那里有许多Windows Phone的铁杆粉丝,其中一些人对于微软明显收

ASP.NET Core框架揭秘(持续更新中…)

之前写了一系列关于.NET Core/ASP.NET Core的文章,但是大都是针对RC版本.到了正式的RTM,很多地方都发生了改变,所以我会将之前发布的文章针对正式版本的.NET Core 1.0进行改写.除此之外,我还会撰写一系列与此相关的文章,这些文章以ASP.NET Core为核心,我个人将它们分成三个主要的部分,即编程基础.支撑框架和管道详解.其中编程基础主要涉及与ASP.NET Core独特的编程模型和相关编程技巧.支撑框架则介绍支撑ASP.NET Core的多个独立的框架,比如依赖

英特尔-android studio 模拟器运行出现问题

问题描述 android studio 模拟器运行出现问题 出现了如下提示emulator: ERROR: x86 emulation currently requires hardware acceleration! Please ensure Intel HAXM is properly installed and usable. CPU acceleration status: HAX kernel module is not installed! 百度了一下 说是要到SDK 下的Inte

Windows Server 2008 R2桌面图标修改指南

http://www.aliyun.com/zixun/aggregation/13975.html">Windows Server 2008 R2 已经在 MSDN 和 TechNet Plus 订阅上公布,gOxiA 在第一时间下载并进行了相关的测试.从 UI 的变化来看 Windows Server 2008 R2(WS08R2)使用的是与 Windows 7 相同设计的 UI.如果添加"桌面体验"组件,即可获得 Aero 等效果!回到正题,相信已经安装 WS08

Windows Server 2008 R2中更改桌面图标

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   如何在Windows Server 2008 R2中更改桌面图标 Windows Server 2008 R2 已经在 MSDN 和 TechNet Plus 订阅上公布,gOxiA 在第一时间下载并进行了相关的测试.从 UI 的变化来看 Windows Server 2008 R2(WS08R2)使用的是与 Windows 7 相同设计的 UI.如果添加&qu

windows server 2008 R2虚拟化高可用群集之一环境准备

昨天完成了2008R2的虚拟化高可用群集,微软总算有了能和vmware ha相媲美的产品了,心里兴奋,虽说2008R2要8月14日才能从msdn上下载到,但是cc忍不住兴奋,还是从远景下载了泄露版,并使用180天试用版key激活使用,为了通俗易懂,特别使用远景泄露版之中文包,方便不懂英文的同学.2008R2的虚拟化高可用群集比2008的群集多了实时迁移和快速迁移! 首先我们需要准备实验环境或者是生产环境 分为1.软件环境和2.硬件环境 一.硬件环境: 1.存储是必须的,可以使用硬件存储或者软件存