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

时间:2015-12-03 18:24:49

标签: c# .net console 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( Microsoft(R)Visual C#编译器版本4.6.0081.0 )运行Ansicon v1.66。

彩色输出在此配置中正常工作; Ansicon本身运作完美无缺。

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

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

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

text file hex editor screenshot

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

enter image description here

只有我用csc构建的test.exe才能打印其他东西。为什么呢?

2 个答案:

答案 0 :(得分:5)

如果使用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写入控制台。在你的评论中你会发现:

  

虽然应用程序可以在ANSI模式下使用WriteConsole来编写ANSI字符,但控制台不支持ANSI转义序列。但是,某些功能提供了相同的功能。有关更多信息,请参阅SetCursorPos,SetConsoleTextAttribute和GetConsoleCursorInfo。

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

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

enter image description here

答案 1 :(得分:5)

我创建了一个small plugin(在NuGet上可用),使您可以轻松地将字符串包装为ANSI颜色代码。支持前景色和背景色。

enter image description here

它通过扩展String对象而起作用,语法非常简单:

"colorize me".Pastel("#1E90FF");

之后,准备将字符串打印到控制台。