zoukankan      html  css  js  c++  java
  • Console的默认Encoding问题

    有时候我们需要在Console程序中,切换Console的OutputStream,大致的做法如下
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
    
              
                //下面的输出是直接打印到屏幕上的
                Console.WriteLine("开始工作" + DateTime.Now.ToString());
    
                //下面的输出将重定向到日志文件中
                var stream = new FileStream("log.txt", FileMode.Create);
                Console.SetOut(new StreamWriter(stream));
                Console.WriteLine("开始工作" + DateTime.Now.ToString());
                Console.WriteLine("结束工作" + DateTime.Now.ToString());
                //到这里结束重定向
                Console.Out.Close();
    
                //重新将输出设置到屏幕上
                Console.SetOut(new StreamWriter(Console.OpenStandardOutput()));
    
                //下面的输出将输出到屏幕上
                Console.WriteLine("结束工作" + DateTime.Now.ToString());
    
                Console.Out.Close();
            }
        }
    }
    

    以上代码是不错的,但有一个问题,就是最后一句输出会出现乱码情况

    image

    从这个情况上看,应该是编码的问题,那么应该是什么编码呢?我尝试了UTF8或者其他的Encoding,都是不行。最后是如下这样解决

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var defaultEncoding = Console.Out.Encoding;
                Console.WriteLine("默认的编码是:" + defaultEncoding.ToString());
              
                //下面的输出是直接打印到屏幕上的
                Console.WriteLine("开始工作" + DateTime.Now.ToString());
    
                //下面的输出将重定向到日志文件中
                var stream = new FileStream("log.txt", FileMode.Create);
                Console.SetOut(new StreamWriter(stream));
                Console.WriteLine("开始工作" + DateTime.Now.ToString());
                Console.WriteLine("结束工作" + DateTime.Now.ToString());
                //到这里结束重定向
                Console.Out.Close();
    
                //重新将输出设置到屏幕上
                Console.SetOut(new StreamWriter(Console.OpenStandardOutput(),defaultEncoding));
    
                //下面的输出将输出到屏幕上
                Console.WriteLine("结束工作" + DateTime.Now.ToString());
    
                Console.Out.Close();
            }
        }
    }
    
    image

    我们看到,其实默认的那个编码方式是所谓的DBCSCodePageEncoding,而此时乱码问题也随之解决了

  • 相关阅读:
    Go语言之Go语言文件处理
    Go语言之Go语言网络编程
    Go语言之Go语言并发
    Go语言之Go语言锁机制
    Go语言之Go语言 异常处理与测试
    Go语言之Go语言反射
    Go语言之Go 语言方法
    Go语言之递归函数
    js 改变文章字体大小
    .net获取当前url各种属性(文件名、参数、域名、端口等)的方法(转)
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/2039623.html
Copyright © 2011-2022 走看看