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,而此时乱码问题也随之解决了

  • 相关阅读:
    【ACM】nyoj_139_我排第几个_201308062046
    【ACM】poj_2356_Find a multiple_201308061947
    【ACM】hdu_zs2_1007_Problem G _201308031028
    【ACM】hdu_zs2_1006_Problem F_201308031058
    【ACM】hdu_zs2_1005_Problem E _201308030747
    【ACM】hdu_zs2_1004_Problem D _201308030856
    【葡萄城报表案例分享】项目施工进度报告 – 树形报表
    【葡萄城报表案例分享】电力设备生产数据的多层分组统计报表实现
    葡萄城报表之多维透视表 – 矩表实现商品销售对比统计
    葡萄城报表之矩表 – 现代数据分析中必不可少的报表工具
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/2039623.html
Copyright © 2011-2022 走看看