在使用ANSI转义序列设置终端文本颜色时,背景颜色和文本(前景)颜色的区分主要通过不同的ANSI代码来实现。ANSI转义序列使用格式为\033[代码m
的结构,其中\033
是转义字符(等同于\e
),m
指示颜色设置的结束。
文本(前景)颜色代码:
文本颜色代码范围从30到37,每个数字对应不同的颜色。也有亮色版本,代码范围从90到97。以下是一些常用的前景色代码示例:
- 30:黑色
- 31:红色
- 32:绿色
- 33:黄色
- 34:蓝色
- 35:品红
- 36:青色
- 37:白色
- 90-97:更亮的颜色版本
背景颜色代码:
背景颜色代码范围从40到47,亮色版本从100到107,使用方法与文本颜色类似,每个数字对应不同的颜色。以下是一些常用的背景色代码示例:
- 40:黑色背景
- 41:红色背景
- 42:绿色背景
- 43:黄色背景
- 44:蓝色背景
- 45:品红背景
- 46:青色背景
- 47:白色背景
- 100-107:更亮的背景颜色版本
结合使用示例:
要同时设置文本颜色和背景颜色,可以将它们的代码结合在同一转义序列中,用分号;
分隔。
echo -e "\033[31;43m红色文本黄色背景\033[0m"
在这个例子中,\033[31;43m
设置了红色的文本(31)和黄色的背景(43)。\033[0m
重置颜色设置,以使之后的文本恢复到默认的颜色。
使用ANSI转义序列时,记得在带有转义序列的echo
命令中包含-e
选项,以确保转义序列被正确解析。
ANSI转义序列中,数字代码用来指示不同的文字样式、前景(文字)颜色和背景颜色。下面是一个详细的列表包含了常用的样式代码、前景色和背景色。
文字样式代码
- 0:重置/正常显示
- 1:加粗或增加强度
- 2:减弱(灰色/暗色)
- 3:斜体
- 4:下划线
- 5:慢速闪烁
- 6:快速闪烁(不普遍支持)
- 7:反显(前景色和背景色交换)
- 8:隐藏(不普遍支持)
- 9:删除线(不普遍支持)
字体颜色(前景色)代码
- 30:黑色
- 31:红色
- 32:绿色
- 33:黄色(或称为棕色或橄榄色)
- 34:蓝色
- 35:品红(或称为紫色)
- 36:青色(或称为蓝绿色)
- 37:白色
- 90-97:亮色版本(亮黑、亮红、亮绿、亮黄、亮蓝、亮品红、亮青、亮白)
背景色代码
- 40:黑色背景
- 41:红色背景
- 42:绿色背景
- 43:黄色背景
- 44:蓝色背景
- 45:品红背景
- 46:青色背景
- 47:白色背景
- 100-107:亮色版本背景(亮黑、亮红、亮绿、亮黄、亮蓝、亮品红、亮青、亮白)
请注意,不同的终端和终端模拟器对这些颜色和样式代码的支持可能会有所不同。特别是,一些旧的终端可能不支持所有的颜色或文本样式代码。此外,当使用亮色版本代码时,具体的显示效果可能也会由于终端的配置不同而有所不同。
标准的printf
函数本身并不支持直接指定RGB颜色值来设置文字或背景色。printf
只负责输出字符到终端,而终端文字颜色的控制是通过ANSI转义序列实现的。尽管标准ANSI转义序列支持一组预定义的颜色,一些现代的终端仿真器支持使用扩展的ANSI转义序列来定义更具体的RGB颜色。
24位真彩色(True Color)支持
对于支持24位色(即RGB色)的终端,你可以使用以下格式的ANSI转义序列来设置前景(文本)和背景色:
- 前景色:
\033[38;2;<R>;<G>;<B>m
- 背景色:
\033[48;2;<R>;<G>;<B>m
其中<R>
、<G>
、<B>
分别是红、绿、蓝颜色分量的值,范围从0到255。
示例
以下是一个使用RGB值设置文本颜色的例子:
#include <stdio.h>int main() {// 设置为红色文本printf("\033[38;2;255;0;0m这是红色文本\033[0m\n");// 重置文本颜色printf("\033[0m");return 0;
}
在这个例子中,\033[38;2;255;0;0m
设置文本颜色为红色(RGB值为255,0,0),\033[0m
用于之后重置文本颜色回默认值。
注意
- 不是所有的终端都支持24位真彩色。在不支持真彩色的终端上使用这些转义序列可能会导致意外的显示效果。
- 对于跨平台的脚本或应用程序,依赖于特定的终端特性(如24位颜色支持)可能会影响其通用性和可移植性。
确定你的终端环境是否支持24位RGB颜色之前,最好进行测试或者查阅你的终端文档。