博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
难道.NET Core到R2连中文编码都不支持吗?
阅读量:6423 次
发布时间:2019-06-23

本文共 2636 字,大约阅读时间需要 8 分钟。

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

转载地址:http://sxrra.baihongyu.com/

你可能感兴趣的文章
FastDFS蛋疼的集群和负载均衡(十七)之解决LVS+Keepalived遇到的问题
查看>>
深入剖析Redis系列(二) - Redis哨兵模式与高可用集群
查看>>
Android 用于校验集合参数的小封装
查看>>
iOS混合开发库(GICXMLLayout)七、JavaScript篇
查看>>
instrument 调试 无法指出问题代码 解决
查看>>
理解缓存
查看>>
BAT 经典算法笔试题 —— 磁盘多路归并排序
查看>>
Nginx限制带宽
查看>>
All Web Application Attack Techniques
查看>>
归档日志ORA-19809: 超出了恢复文件数的限制
查看>>
精品德国软件 UltraShredder 文件粉碎机
查看>>
PANDAS 数据合并与重塑(join/merge篇)
查看>>
文件时间信息在测试中的应用
查看>>
直播疑难杂症排查(8)— 播放杂音、噪音、回声问题
查看>>
如何写gdb命令脚本
查看>>
Android ListView展示不同的布局
查看>>
iOS宏(自己使用,持续更新)
查看>>
手把手玩转win8开发系列课程(3)
查看>>
NGINX引入线程池 性能提升9倍
查看>>
《淘宝技术这十年》读书笔记 (四). 分布式时代和中间件
查看>>