Linux设置终端输出字体颜色
0x01 终端配色方法简介
使用\033[01;04;32;41m之类的配色方案在需要输出显示的文本之前,可以改变应用程序输出文本的颜色或者背景颜色。
#include <stdio.h>
int main()
{
printf("\033[01;34m Hello World\033[0m\n");
return 0;
}
上面的01表示加粗,34表示是蓝色,后面\033[0m表示恢复所有的属性为原来的默认值。更多关于颜色的参考,
http://www.pixelbeat.org/docs/terminal_colours/有非常详细的叙述。也可以把上述的\033字符用\e或者\x1b替换。
可以采用多种配色方案,比如上面提到的\033[01;04;32;41m,04表示下划线,32表示前景色是绿色,然后41表示背景色是红色。
由于使用的是Linux系统为终端提供的配色方案,所以该程序不具备移植性。可以看到,该程序在Windows会打印一些奇怪的符号。
字颜色: 30–39
30: 黑
31: 红
32: 绿
33: 黄
34: 蓝
35: 紫
36: 深绿
37: 白色
字背景颜色范围: 40–49
40: 黑
41: 红
42: 绿
43: 黄
44: 蓝
45: 紫
46: 深绿
47: 白色
ANSI控制码:
QUOTE:
/033[0m 关闭所有属性
/033[1m 设置高亮度
/03[4m 下划线
/033[5m 闪烁
/033[7m 反显
/033[8m 消隐
/033[30m – /033[37m 设置前景色
/033[40m – /033[47m 设置背景色
/033[nA 光标上移n行
/03[nB 光标下移n行
/033[nC 光标右移n行
/033[nD 光标左移n行
/033[y;xH设置光标位置
/033[2J 清屏
/033[K 清除从光标到行尾的内容
/033[s 保存光标位置
/033[u 恢复光标位置
/033[?25l 隐藏光标
/33[?25h 显示光标
0x02 简单的终端颜色改变程序
#include <unistd.h>
#include <iostream>
#include <stdarg.h>
#include <cstdio>
#include <string.h>
#include <stdlib.h>
enum Color {
BLACK = 30,
RED = 31,
GREEN = 32,
BROWN = 33,
BLUE = 34,
MAGENTA = 35,
CYAN = 36,
GREY = 37,
LRED = 41,
LGREEN = 42,
YELLOW = 43,
LBLUE = 44,
LMAGENTA = 45,
LCYAN = 46,
WHITE = 47
};
void set_color(int fd, Color color) {
char buffer[32];
snprintf(buffer, sizeof(buffer), "\x1b[%d%sm",
color >= LRED ? (color - 10) : color,
color >= LRED ? ";1" : ""
);
write(fd, buffer, strlen(buffer));
}
void reset_color(int fd) {
const char* s = "\x1b[0m";
write(fd, s, strlen(s));
}
int main(void)
{
int color;
int count = 0;
std::cout<<"please input color eum(30 - 47):\t";
while(1)
{
std::cout << "this is " << count++ << " times..."<<std::endl;
std::cin>>color;
if (color >= 30 && color <38 || color >= 40 && color < 48)
{
set_color(STDOUT_FILENO, (Color)color);
std::cout << "set color success...."<<std::endl;
}
else if(-1 == color)
{
reset_color(STDOUT_FILENO);
std::cout << "reset_color success...."<<std::endl;
break;
}
else
{
std::cout<<"Warning: please input color range [30, 37] [40, 47]"<<std::endl;
}
}
std::cout<<"bye~bye ...."<<std::endl;
exit(EXIT_SUCCESS);
}
演示: