LV050-带颜色的输出
printf 也可以输出带颜色的字符?
一、ANSI 控制码简介
1. 什么是 ANSI 控制码
ANSI 转义序列(ANSI Escape Sequences)是一系列以 ESC(ASCII 码 27,即 \033 或 \x1B) 开头的控制字符序列,用于在终端或控制台中控制文本的显示格式、颜色、光标位置等。它们最初由 ANSI(美国国家标准协会)制定,成为终端控制的通用标准,广泛应用于 Unix/Linux 终端、Windows 的现代终端(如 PowerShell、Windows Terminal)以及编程语言的输出中。
ANSI ESCAPE SEQUENCES 又称为 VT100 系列控制码,国内译为 ANSI 控制码。 ANSI 控制码依赖终端,不是依赖语言,所以在 shell , perl , C 里应用都是可以的。
2. 可以控制哪些内容?
| 控制内容 | 说明 |
|---|---|
| 文本样式 | 加粗、斜体、下划线、闪烁等。 |
| 文本颜色 | 前景色(文字颜色)和背景色。 |
| 光标控制 | 移动光标、隐藏/显示光标、保存/恢复光标位置。 |
| 清屏操作 | 清除屏幕或行。 |
| 终端模式 | 切换键盘输入模式等。 |
3. 开始标志
所有 ANSI 转义序列以 ESC[(即 \033[ 或 \x1B[)开头,后跟参数,最后以字母(称为“终止符”)结束。例如:
ESC[31m # 设置文本颜色为红色(31 是红色代码)
ESC[0m # 重置所有样式(0 是重置代码)我们可以直接在 shell 终端尝试一下:
# Bash 中直接输出彩色文本
echo -e "\033[31m红色文字\033[0m"效果如下:
二、ANSI 控制码
1. 概述
这里只写了一部分,还有一些其他的控制码,这里就不列出了。
| \033[0m | 关闭所有属性 |
| \033[1m | 设置高亮度 |
| \033[4m | 下划线 |
| \033[5m | 闪烁 |
| \033[7m | 反显 |
| \033[8m | 消隐 |
| \033[30m ~ \033[37m | 设置前景色(字体色) 30: 黑 31: 红 32: 绿 33: 黄 34: 蓝 35: 紫 36: 深绿 37: 白 |
| \033[40m ~ \033[47m | 设置背景色 40: 黑 41: 红 42: 绿 43: 黄 44: 蓝 45: 紫 46: 深绿 47: 白 |
| \033[nA | 光标上移 n 行 |
| \033[nB | 光标下移 n 行 |
| \033[nC | 光标右移 n 行 |
| \033[nD | 光标左移 n 行 |
| \033[y; xH | 设置光标位置,将光标移动到 y 行 x 列的位置 |
| \033[2J | 清屏,光标移到左上角 |
| \033[K | 清除从光标到行尾的内容 |
| \033[s | 保存光标位置 |
| \033[u | 恢复光标位置 |
| \033[?25l | 隐藏光标 |
| \033[?25h | 显示光标 |
\033[n1;n2;......m设定显示字符的属性状态。若有两个以上设定则以 分号 将代码隔开。除非重新设定,否则原设定之属性一直被保留,若想后边的不受影响,可以在结束后加一个 \033[0m 。
2. 颜色控制
大多数终端支持 8 色和 16 色,以及 256(8 位)色。这些颜色由用户设置,但通常具有定义好的含义。一般来说 8-16 Colors 足够用了,个人认为打印信息颜色太多有点花里胡哨了,能够正常区分打印信息,警告信息和错误信息即可。
| 颜色名 | 前景色(字)码 | 背景色码 |
|---|---|---|
| 黑 | 30 | 40 |
| 红 | 31 | 41 |
| 绿 | 32 | 42 |
| 黄 | 33 | 43 |
| 蓝 | 34 | 44 |
| 品红 | 35 | 45 |
| 青 | 36 | 46 |
| 白 | 37 | 47 |
| 默认 | 39 | 49 |
| 重置 | 0 | 0 |
注意: 重置 色重置所有颜色、字体效果,默认 色只重置颜色。
大多数终端除了基本的 88 种颜色外,还支持“明亮”或“大胆”的颜色。它们有自己的一套代码,与正常的颜色镜像,但在代码中有一个额外的 ;1:
# 设置样式为粗体,红色字(前景色)。
\033[1;31mHello
# 设置样式为暗淡的白色字(前景色),红色背景。
\033[2;37;41mWorld三、在C语言中的应用
3.1 printf 使用格式
printf("\033[颜色值m 文本\n") /* 最后加上\033[0m 可以使其不影响其他字体 */3.2 使用实例
#include <stdio.h>
/* 前景色(字体颜色),printf 打印输出的颜色定义,主要是用于实现带颜色的输出 */
#define CLS "\033[0m" /* 清除所有颜色 */
#define BLACK "\033[1;30m" /* 黑色加粗字体 */
#define RED "\033[1;31m" /* 红色加粗字体 */
#define GREEN "\033[1;32m" /* 绿色加粗字体 */
#define YELLOW "\033[1;33m" /* 黄色加粗字体 */
#define BLUE "\033[1;34m" /* 蓝色加粗字体 */
#define PURPLE "\033[1;35m" /* 紫色加粗字体 */
#define CYAN "\033[1;36m" /* 青色加粗字体 */
#define WHITE "\033[1;37m" /* 白色加粗字体 */
#define BOLD "\033[1m" /* 加粗字体 */
int main(int argc, char *argv[])
{
printf(RED"hello world!\n"CLS);
printf(GREEN"hello world!\n"CLS);
printf(BLUE"hello world!\n"CLS);
printf(CYAN"hello world!\n"CLS);
printf("\033[1;41;36mhello world!\033[0m\n");
printf(WHITE"hello world!\n"CLS);
return 0;
}参考资料: