zoukankan      html  css  js  c++  java
  • 解决.NET Core R1中文乱码问题

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

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

    我们在Main方法中只编写了如下几行行程序,将输入的字符串直接打印出来。

     using System;
      
     namespace App
     {
         public class Program
         {
             public static void Main(string[] args)
             {
                 while (true)
                 {
                     Console.WriteLine(Console.ReadLine());
                 }
             }
         }
     }
    

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

    为了进一步证明.NET Core对编码的局限,我们按照如下的方式调用Encoding的GetEncoding方法分别获取两种中文编码:GB2312和CP936。

     using System;
     using System.Text;
      
     namespace App
     {
         public class Program
         {
             public static void Main(string[] args)
             {
                 try
                 {
                     Console.WriteLine(Encoding.GetEncoding(936));
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message);
                 }
      
                 try
                 {
                     Console.WriteLine(Encoding.GetEncoding("GB2312"));
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message);
                 }
             }
         }
     }
    

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

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

     using System;
     using System.Text;
      
     namespace App
     {
         public class Program
         {
             public static void Main(string[] args)
             {
                 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
                 Console.WriteLine(Encoding.GetEncoding(936));
                 Console.WriteLine(Encoding.GetEncoding("GB2312"));
                 while (true)
                 {
                     Console.WriteLine(Console.ReadLine());
                 }
             }
         }
     }
    

    CodePageEncodingProvider定义在NuGet包“System.Text.Encoding.CodePages”之中,所以我们需要现在Project.json文件中按照如下的方式注册对应的依赖。

     {
       ...
       "dependencies": {
         "Microsoft.NETCore.App": {
           "type": "platform",
           "version": "1.0.0-rc2-3002702"
         },
         "System.Text.Encoding.CodePages":  "4.0.1-rc2-24027"
       },
       ...
     }
    

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

  • 相关阅读:
    PCIe体系结构概述
    PCI Express 系统体系结构标准教材
    PCI Express体系结构导读(1)
    windows设备驱动程序WDF开发(3)
    windows设备驱动程序WDF开发(2)
    Linux驱动开发概述
    基于WDF的PCI/PCIe接口卡Windows驱动程序(5)-如何为硬件移植驱动程序
    基于WDF的PCI/PCIe接口卡Windows驱动程序(4)- 驱动程序代码(源文件)
    基于WDF的PCI/PCIe接口卡Windows驱动程序(3)- 驱动程序代码(头文件)
    基于WDF的PCI/PCIe接口卡Windows驱动程序(2)-开发者需要了解的WDF中的一些重要的概念
  • 原文地址:https://www.cnblogs.com/bwlluck/p/6831411.html
Copyright © 2011-2022 走看看