使用C/C++,如何以彩色打印到stdout,但只有终端支持它?

ere*_*eOn 23 c c++ linux colors

我有一个记录事情的程序STDOUT.

这些日志条目具有关联的"日志级别"(调试,警告,信息等),我想让用户能够为此输出着色,具体取决于日志级别.

确定是否STDOUT附加到具有彩色功能的终端的方法是什么?那我怎么能用颜色输出我的文字呢?

我正在寻找一个只涉及C或C++调用的解决方案.我猜curses(或ncurses)有一些东西可以缓解这一点,但我想避免使用它来保持我的依赖关系最小化.

dus*_*uff 33

可能最简单的检查方法是:

isatty(fileno(STDOUT))
Run Code Online (Sandbox Code Playgroud)

1如果您的标准输出被发送到任何类型的终端,这将返回.在实践中,任何终端都将支持或忽略VT100颜色代码; 检查terminfo是不必要的,除非您希望输出到某些非常不寻常的硬件终端.(其中大部分都没有在几十年内完成.)

要输出颜色,请使用(扩展)SGR序列:

"\x1b[%dm"
Run Code Online (Sandbox Code Playgroud)

其中%d一个是常用颜色的以下值之一:

0: reset colors/style
1: bold
4: underline
30 - 37: black, red, green, yellow, blue, magenta, cyan, and white text
40 - 47: black, red, green, yellow, blue, magenta, cyan, and white background
Run Code Online (Sandbox Code Playgroud)

有更多的值,但这些是最受支持的值.同样,检查terminfo对于这些控制代码来说基本上是不必要的,因为每个值得盐的软件终端都支持(或忽略)它们.

如果需要一次更改多个属性,可以一次指定所有属性,用分号分隔.例如,以下序列将在绿色背景上用大胆的洋红色文字灼烧您的眼球:

"\x1b[1;35;42m"
Run Code Online (Sandbox Code Playgroud)

  • 为了记录:Xcode(OSX的标准IDE)内置控制台不支持(也不忽略)ANSI颜色序列(它试图打印它们,导致无法读取的垃圾).我真的很喜欢一个检查颜色支持的片段. (10认同)
  • 它是ANSI,而不是VT100,代码.或者,如果您想要精确,也可以使用ISO/IEC 6429代码.谨慎地注意到`"\ x1b ["`==`"\ 033 ["`== CSI.http://en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes有一个非常好的列表,以及可移植性和其他有用的信息. (3认同)