当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用.NET的ANSI着色控制台输出》经验,为你挑选了2个好方法。

我尝试使用ANSI转义码生成彩色控制台输出,并使用以下最小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");

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

文本文件hex编辑器截图

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

在此输入图像描述

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



1> silkfire..:

我创建了一个小插件(可从NuGet上获得),使您可以轻松地将字符串包装为ANSI颜色代码。支持前景色和背景色。

它通过扩展String对象来工作,语法非常简单:

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

之后,可以将字符串打印到控制台了。



2> rene..:

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

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

您需要获取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等适用的终端仿真器,如下所示:

在此输入图像描述

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有