如何将彩色字符打印到支持彩色字符的Linux终端?
如何判断终端是否支持颜色码?
如何将彩色字符打印到支持彩色字符的Linux终端?
如何判断终端是否支持颜色码?
当前回答
你可以使用转义序列,如果你的终端支持的话。例如:
echo \[\033[32m\]Hello, \[\033[36m\]colourful \[\033[33mworld!\033[0m\]
其他回答
您需要输出ANSI颜色代码。注意,并非所有终端都支持此功能;如果不支持颜色序列,就会显示垃圾。
例子:
cout << "\033[1;31mbold red text\033[0m\n";
这里,\033是ESC字符,ASCII 27。它后面跟着[,然后是0个或多个用;隔开的数字,最后是字母m。这些数字描述了从这一点开始切换的颜色和格式。
前景色和背景色的代码如下:
foreground background
black 30 40
red 31 41
green 32 42
yellow 33 43
blue 34 44
magenta 35 45
cyan 36 46
white 37 47
此外,你可以使用这些:
reset 0 (everything back to normal)
bold/bright 1 (often a brighter shade of the same colour)
underline 4
inverse 7 (swap foreground and background colours)
bold/bright off 21
underline off 24
inverse off 27
有关其他不太受广泛支持的代码,请参见维基百科上的表格。
要确定您的终端是否支持颜色序列,请读取TERM环境变量的值。它应该指定所使用的特定终端类型(例如vt100、gnome-terminal、xterm、screen……)。然后在terminfo数据库中查找;检查颜色能力。
正如其他人所述,您可以使用转义字符。 你可以使用我的标题,以使它更容易:
#ifndef _COLORS_
#define _COLORS_
/* FOREGROUND */
#define RST "\x1B[0m"
#define KRED "\x1B[31m"
#define KGRN "\x1B[32m"
#define KYEL "\x1B[33m"
#define KBLU "\x1B[34m"
#define KMAG "\x1B[35m"
#define KCYN "\x1B[36m"
#define KWHT "\x1B[37m"
#define FRED(x) KRED x RST
#define FGRN(x) KGRN x RST
#define FYEL(x) KYEL x RST
#define FBLU(x) KBLU x RST
#define FMAG(x) KMAG x RST
#define FCYN(x) KCYN x RST
#define FWHT(x) KWHT x RST
#define BOLD(x) "\x1B[1m" x RST
#define UNDL(x) "\x1B[4m" x RST
#endif /* _COLORS_ */
使用header的宏的一个例子可以是:
#include <iostream>
#include "colors.h"
using namespace std;
int main()
{
cout << FBLU("I'm blue.") << endl;
cout << BOLD(FBLU("I'm blue-bold.")) << endl;
return 0;
}
你可以使用转义序列,如果你的终端支持的话。例如:
echo \[\033[32m\]Hello, \[\033[36m\]colourful \[\033[33mworld!\033[0m\]
你可以直接编写ANSI转义代码来控制颜色,也可以使用诸如{fmt}这样的库来提供api。
例如:
#include <fmt/color.h>
int main() {
fmt::print(fg(fmt::color::crimson) | fmt::emphasis::bold,
"Hello, {}!\n", "world");
}
打印
大多数现代终端都支持ANSI转义序列,但您可以使用terminfo数据库进行检查。
在OSX shell上,这为我工作(包括“红色文本”前面的2个空格):
$ printf "\e[033;31m red text\n"
$ echo "$(tput setaf 1) red text"