ANSI 转义序列是一种在终端中改变文本颜色和其他属性的方法。基本格式为 \e[<code>m
,其中 <code>
是一系列数字,用于表示不同的颜色和属性。
基本格式
\e[<code>m
这里的 <code>
可以是单个或多个数字,用分号 ;
分隔。例如,1;31
表示加粗红色文本。
ANSI 颜色代码
前景色
代码 | 描述 |
---|---|
30 | 黑色 |
31 | 红色 |
32 | 绿色 |
33 | 黄色 |
34 | 蓝色 |
35 | 紫色(品红) |
36 | 青色 |
37 | 白色 |
39 | 默认颜色 |
背景色
代码 | 描述 |
---|---|
40 | 黑色背景 |
41 | 红色背景 |
42 | 绿色背景 |
43 | 黄色背景 |
44 | 蓝色背景 |
45 | 紫色(品红)背景 |
46 | 青色背景 |
47 | 白色背景 |
49 | 默认背景颜色 |
样式代码
代码 | 描述 |
---|---|
0 | 重置所有属性 |
1 | 加粗(亮色) |
2 | 淡色 |
3 | 斜体(部分终端不支持) |
4 | 下划线 |
5 | 闪烁 |
7 | 反色(反转前景和背景) |
8 | 隐藏 |
示例代码
下面是一些使用 ANSI 转义序列实现彩色输出的示例代码:
示例 1:简单彩色输出
#include <stdio.h>int main() {printf("\e[31mRed Text\e[0m\n"); // 红色文本printf("\e[32mGreen Text\e[0m\n"); // 绿色文本printf("\e[33mYellow Text\e[0m\n"); // 黄色文本return 0;
}
示例 2:复合样式输出
#include <stdio.h>int main() {printf("\e[1;31mBold Red Text\e[0m\n"); // 加粗红色文本printf("\e[4;32mUnderlined Green Text\e[0m\n"); // 下划线绿色文本printf("\e[7;33mReversed Yellow Text\e[0m\n"); // 反色黄色文本return 0;
}
示例 3:背景颜色输出
#include <stdio.h>int main() {printf("\e[41mRed Background\e[0m\n"); // 红色背景printf("\e[42mGreen Background\e[0m\n"); // 绿色背景printf("\e[43mYellow Background\e[0m\n"); // 黄色背景return 0;
}
示例 4:组合颜色和样式
#include <stdio.h>int main() {printf("\e[1;31;42mBold Red Text on Green Background\e[0m\n"); // 加粗红色文本在绿色背景上return 0;
}
高亮和淡色
除了基本的颜色代码外,还可以使用高亮(明亮)和淡色(浅色)版本的颜色:
高亮(明亮)前景色
代码 | 描述 |
---|---|
90 | 淡灰色 |
91 | 亮红色 |
92 | 亮绿色 |
93 | 亮黄色 |
94 | 亮蓝色 |
95 | 亮紫色(品红) |
96 | 亮青色 |
97 | 亮白色 |
高亮(明亮)背景色
代码 | 描述 |
---|---|
100 | 淡灰色背景 |
101 | 亮红色背景 |
102 | 亮绿色背景 |
103 | 亮黄色背景 |
104 | 亮蓝色背景 |
105 | 亮紫色(品红)背景 |
106 | 亮青色背景 |
107 | 亮白色背景 |
示例 5:高亮颜色输出
#include <stdio.h>int main() {printf("\e[91mBright Red Text\e[0m\n"); // 亮红色文本printf("\e[92mBright Green Text\e[0m\n"); // 亮绿色文本printf("\e[93mBright Yellow Text\e[0m\n"); // 亮黄色文本return 0;
}
示例 6:高亮背景颜色输出
#include <stdio.h>int main() {printf("\e[101mBright Red Background\e[0m\n"); // 亮红色背景printf("\e[102mBright Green Background\e[0m\n"); // 亮绿色背景printf("\e[103mBright Yellow Background\e[0m\n"); // 亮黄色背景return 0;
}
示例 7:组合高亮颜色和样式
#include <stdio.h>int main() {printf("\e[1;91;102mBold Bright Red Text on Bright Green Background\e[0m\n"); // 加粗亮红色文本在亮绿色背景上return 0;
}
注意事项
- 兼容性:不同的终端支持的 ANSI 转义序列可能会有所不同,有些终端可能不支持某些样式或颜色。
- 重置所有属性:在使用 ANSI 转义序列后,最好添加
\e[0m
来重置所有属性,确保后续的文本不受影响。 - Windows 支持:在 Windows 系统中,默认的命令行工具(如 cmd.exe)对 ANSI 转义序列的支持有限。可以使用 PowerShell 或启用虚拟终端处理的 cmd.exe(通过
ENABLE_VIRTUAL_TERMINAL_PROCESSING
选项)来支持 ANSI 转义序列。
示例:Windows 上启用 ANSI 支持
在 Windows 10 中,可以通过以下代码启用对 ANSI 转义序列的支持:
#include <windows.h>
#include <stdio.h>int main() {HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);DWORD consoleMode;GetConsoleMode(hConsole, &consoleMode);consoleMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;SetConsoleMode(hConsole, consoleMode);printf("\e[31mRed Text\e[0m\n");printf("\e[32mGreen Text\e[0m\n");printf("\e[33mYellow Text\e[0m\n");return 0;
}
通过这些示例和解释,你应该能够更好地理解和应用 ANSI 转义序列来实现彩色输出。希望这能帮助你在实际项目中使用 printf
实现丰富多彩的终端输出。