Skip to content

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[)开头,后跟参数,最后以字母(称为“终止符”)结束。例如:

shell
ESC[31m   # 设置文本颜色为红色(31 是红色代码)
ESC[0m    # 重置所有样式(0 是重置代码)

我们可以直接在 shell 终端尝试一下:

shell
# Bash 中直接输出彩色文本
echo -e "\033[31m红色文字\033[0m"

效果如下:

image-20260206152546712

二、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 显示光标
【**显示字符属性控制**】
shell
\033[n1;n2;......m

设定显示字符的属性状态。若有两个以上设定则以 分号 将代码隔开。除非重新设定,否则原设定之属性一直被保留,若想后边的不受影响,可以在结束后加一个 \033[0m 。

2. 颜色控制

大多数终端支持 8 色和 16 色,以及 256(8 位)色。这些颜色由用户设置,但通常具有定义好的含义。一般来说 8-16 Colors 足够用了,个人认为打印信息颜色太多有点花里胡哨了,能够正常区分打印信息,警告信息和错误信息即可。

颜色名前景色(字)码背景色码
3040
3141
绿3242
3343
3444
品红3545
3646
3747
默认3949
重置00

注意: 重置 色重置所有颜色、字体效果,默认 色只重置颜色。

大多数终端除了基本的 88 种颜色外,还支持“明亮”或“大胆”的颜色。它们有自己的一套代码,与正常的颜色镜像,但在代码中有一个额外的 ;1

shell
# 设置样式为粗体,红色字(前景色)。
\033[1;31mHello
# 设置样式为暗淡的白色字(前景色),红色背景。
\033[2;37;41mWorld

三、在C语言中的应用

3.1 printf 使用格式

c
printf("\033[颜色值m 文本\n")  /* 最后加上\033[0m 可以使其不影响其他字体 */

3.2 使用实例

c
#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;
}

参考资料:

终端 ANSI 转义字符的各种玩法 - Hexo

ANSI 转义序列(ANSI Escape Sequences) - Po7ed - 博客园