如何在C和C++中使用ANSI Escape Codes来输出带颜色的文本?
如何在C和C++中使用ANSI Escape Codes来输出带颜色的文本?
我在这里读到了关于ANSI-C转义码的内容。我试着在C/C++的printf/std::cout中使用它来给控制台输出的文本上色,但没有成功。
我的尝试:
#include
#include
int main() {
int a=3, b=5;
int &ref = a;
ref = b;
//cout << "\155\32\m" << a << b <<'\n'; //这里打印出m→m 5,没有上色的文本
printf("\155\32\m %d",a); //这里也打印出相同的结果 - m→m 5
getchar();
}
我该如何使用这些转义码来输出带颜色的文本到控制台?
我有什么遗漏吗?
另外,我记得在某些C++代码中看到过对这个函数的调用
textcolor(10);
但在g++和Visual Studio中都出现了编译错误。哪个编译器有这个函数可用?有什么详细信息吗?
如何在C和C++中使用ANSI Escape Codes来输出彩色文本?
问题的出现原因:
在某个时候,我创建了一个非常简单的文本管理库,它是跨平台的。对于Windows平台,它使用本地API调用,而对于其他平台则使用ANSI转义序列。该库已经完全文档化,并且您也可以浏览源代码。关于您的具体问题,我认为您可能缺少一些代码。例如,要更改文本的颜色,您应该使用类似以下的代码:
解决方法:
static const char * CSI = "\33["; printf( "%s%s", CSI, "31m" ); // RED
但是,我猜在Windows cmd中,用于着色文本的ANSI转义序列只在DOS控制台上有效,而在Windows cmd中,它会打印出一些控制字符而不是彩色文本。
是的,在Windows命令控制台中,您必须使用Windows API调用。我给您指出的库可以自动化这个过程。
我几乎想建议在这种情况下使用预处理器宏,这样您可以将字符串编写为:
printf("Hello" COLOR_RED " World" COLOR_OFF);
这样可以方便地设置文本的颜色。
希望对您有所帮助。
文章结束
在Windows 10中,可以通过在当前控制台中激活VT100模式来使用VT100样式:
#include <windows.h> #include <iostream> #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 #define DISABLE_NEWLINE_AUTO_RETURN 0x0008 int main() { HANDLE handleOut = GetStdHandle(STD_OUTPUT_HANDLE); DWORD consoleMode; GetConsoleMode( handleOut , &consoleMode); consoleMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; consoleMode |= DISABLE_NEWLINE_AUTO_RETURN; SetConsoleMode( handleOut , consoleMode ); for (int i = 0; i < 10; ++i) { std::cout << "\x1b[38;2;" << 5 * i << ";" << 255 - 10 * i << ";220m" << "ANSI Escape Sequence " << i << std::endl; } }
参考MSDN页面:[https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences][1]
原因:在Windows 10中,输出彩色文本的一种方法是使用ANSI Escape Codes。然而,默认情况下,Windows控制台不支持这些转义序列。因此,需要通过激活VT100模式来启用这些功能。
解决方法:在C++程序中,可以使用Windows API来激活VT100模式并使用ANSI Escape Codes输出彩色文本。以上代码片段展示了如何使用Windows API来实现这一目标。首先,通过调用GetStdHandle函数获取标准输出句柄,然后使用GetConsoleMode函数获取控制台模式。接下来,将ENABLE_VIRTUAL_TERMINAL_PROCESSING和DISABLE_NEWLINE_AUTO_RETURN标志位设置为控制台模式,并将其与consoleMode变量进行按位或操作。最后,使用SetConsoleMode函数将更新后的控制台模式应用于标准输出句柄。通过这些步骤,可以激活VT100模式并在程序中使用ANSI Escape Codes输出彩色文本。
[1]: https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences
这篇文章将讨论如何在C和C++中使用ANSI转义码输出带颜色的文本。在代码中,作者提到了一个问题,即忘记了转义字符ESC。然后,作者给出了解决该问题的方法。作者建议在printf函数中使用转义字符ESC来输出带颜色的文本。但是,这种方法只适用于支持ANSI转义序列的控制台(如使用bash的Linux控制台或使用ansi.sys的旧Windows控制台)。某些情况下这种方法在某些情况下不起作用,他们建议尝试其他答案。另外,还有另一种解决方法,即使用\xNN表示法来定义字符串中的ESC字符代码,其中NN是ESC符号的十六进制代码(0x1B等于十进制的27)。同时,作者还指出可以将字符串分成几个部分,以使代码更清晰。最后,作者提到Windows 10+现在也提供了类似的功能,但需要启用。整个控制台API都已过时。