c# – 使用.NET的ANSI着色控制台输出

我尝试使用 ANSI escape codes使用以下最小C#程序生成彩色控制台输出
using System;

// test.cs
class foo {
    static void Main(string[] args) {
        Console.WriteLine("\x1b[36mTEST\x1b[0m");
    }
}

我在Windows 7 x64上使用csc.exe运行Ansicon v1.66(Microsoft(R)Visual C#编译器版本4.6.0081.0).

彩色输出在这种配置下工作正常; Ansicon本身运作完美无缺.

要进行交叉检查,我使用一个与C#程序100%等效的node.js单行程序:

// test.js
console.log("\x1b[36mTEST\x1b[0m");

而且,更基本的是手工制作的文本文件

两者都正确地做了预期的事情:打印青色的字符串“TEST”:

只有我用csc构建的test.exe才能打印其他内容.为什么?

解决方法

如果使用AnsiCon x64环境,则需要为/ platform编译程序:x64;如果使用AnsiCon x86 / 32位版本,则需要使用/ platform:x86编译.确切的原因是一个谜……

最初我认为你需要这一切:

您需要获取StandardOutput并让Console.WriteLine相信您写入文件而不是控制台并使用ASCII编码.

这是它的工作方式:

var stdout = Console.OpenStandardOutput();
 var con = new StreamWriter(stdout,Encoding.ASCII);
 con.AutoFlush = true;
 Console.SetOut(con);

 Console.WriteLine("\x1b[36mTEST\x1b[0m");

.Net Console.WriteLine使用内部__ConsoleStream来检查Console.Out是作为文件句柄还是控制台句柄.默认情况下,它使用控制台句柄,因此通过调用WriteConsoleW写入控制台.在备注中,您会发现:

Although an application can use WriteConsole in ANSI mode to write ANSI characters,consoles do not support ANSI escape sequences. However,some functions provide equivalent functionality. For more information,see SetCursorPos,SetConsoleTextAttribute,and GetConsoleCursorInfo.

要将字节直接写入控制台而不使用WriteConsoleW干扰简单的文件句柄/流,这将通过调用OpenStandardOutput来实现.通过将该流包装在StreamWriter中,我们可以使用Console.SetOut再次设置它,我们就完成了.字节序列被发送到OutputStream并由AnsiCon拾取.

请注意,这仅适用于AnsiCon等适用的终端仿真器,如下所示:

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString("x2"));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable<Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include "WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...