使用C语言输出不同颜色——ANSI颜色编码的应用(一)

 一、ANSI标准的起源与发展

      ANSI颜色编码系统诞生于20世纪70年代,最初是为早期计算机终端设计的控制序列。这套系统最初出现在VT100终端上,由数字设备公司(DEC)开发,后来被采纳为行业标准。在个人计算机革命之前,这些编码是计算机与用户交互的主要方式。

      尽管如今图形用户界面成为主流,但在服务器管理中,管理员通过命令行远程管理服务器时,ANSI 颜色可用于区分不同类型的信息,如红色表示错误、绿色表示成功等,方便快速识别。在开发者工具中,例如编译器的输出结果、代码编辑器的语法高亮等也常使用 ANSI 颜色来增强可读性和区分度。在命令行应用中,如一些文本处理工具、系统监控工具等,ANSI 颜色能使输出信息更加直观和易于理解,所以它在这些领域确实保持着不可替代的地位。

二、ANSI颜色编码的核心语法

\033[代码1;代码2;...代码n m

其中:
• \033是转义字符(ASCII 27),也可写作 \e 或 \x1b
• [ 是控制序列引导符
• 数字代码定义各种显示属性
• m是终止字符

一个典型的颜色设置示例:

echo -e "\033[1;31;47m白底红字\033[0m"

这段代码会输出加粗(1)的红色文本(31)显示在白色背景(47)上。

三、基础文本属性

代码

效果

说明

0

重置所有属性

必须在使用颜色后调用

1

加粗/高亮

实际效果取决于终端实现

2

弱化(较暗)

不是所有终端都支持

3

斜体

4

下划线

5

缓慢闪烁

可能被禁用

7

反色显示

前景背景互换

8

隐藏

文字不可见但仍可选中

9

删除线

示例代码: 

#include <stdio.h>

int main() {
    printf("\033[1m加粗文本\033[0m\n");
    printf("\033[3m斜体文本\033[0m\n");
    printf("\033[4m下划线文本\033[0m\n");
    printf("\033[5m闪烁文本\033[0m\n");
    printf("\033[7m反色文本\033[0m\n");
    printf("\033[9m删除线文本\033[0m\n");
    
    // 组合使用
    printf("\033[1;3;4m加粗+斜体+下划线\033[0m\n");
    return 0;
}

运行效果:

四、颜色代码详解

基础8色系统

代码

前景色

背景色

颜色

30

-

31

-

32

-

绿

33

-

34

-

35

-

36

-

37

-

40

-

41

-

42

-

绿

43

-

44

-

45

-

46

-

47

-

示例代码:

#include <stdio.h>

int main() {
    // 前景色示例
    printf("\033[31m红色文本\033[0m\n");
    printf("\033[32m绿色文本\033[0m\n");
    printf("\033[33m黄色文本\033[0m\n");
    
    // 背景色示例
    printf("\033[41m红色背景\033[0m\n");
    printf("\033[42m绿色背景\033[0m\n");
    
    // 组合使用
    printf("\033[31;42m红字绿背景\033[0m\n");
    printf("\033[1;33;44m加粗黄字蓝背景\033[0m\n");
    
    return 0;
}

运行效果:

五、16色扩展系统

在基础8色上增加亮色变体:

代码

颜色

90

暗灰

91

亮红

92

亮绿

93

亮黄

94

亮蓝

95

亮紫

96

亮青

97

亮白

亮色背景

代码

颜色

100

暗灰

101

亮红

102

亮绿

103

亮黄

104

亮蓝

105

亮紫

106

亮青

107

亮白

示例代码:

#include <stdio.h>

int main() {
    // 亮色前景
    printf("\033[91m亮红色文本\033[0m\n");
    printf("\033[92m亮绿色文本\033[0m\n");
    
    // 亮色背景
    printf("\033[101m亮红背景\033[0m\n");
    printf("\033[102m亮绿背景\033[0m\n");
    
    // 复杂组合
    printf("\033[1;91;104m加粗亮红字亮蓝背景\033[0m\n");
    printf("\033[3;95;102m斜体亮紫字亮绿背景\033[0m\n");
    
    return 0;
}

运行效果:

六、颜色与属性的组合规则

  1. 顺序无关性​:\033[1;31m 和 \033[31;1m 效果相同
  2. 重置需求​:必须使用\033[0m重置,否则效果会持续
  3. 叠加效果​:多个属性会同时生效
  4. 颜色覆盖​:后设置的颜色会覆盖前一个颜色设置

示例代码:

#include <stdio.h>

int main() {
    // 多种属性组合
    printf("\033[1;3;4;31m加粗+斜体+下划线+红字\033[0m\n");
    
    // 分阶段设置
    printf("\033[1m加粗\033[31m红色\033[4m下划线\033[0m\n");
    
    // 背景+前景组合
    printf("\033[31;47m红字白背景\033[0m\n");
    
    return 0;
}

 运行效果:

七、实用代码模板

 示例代码:

#include <stdio.h>

void color_print(const char* color, const char* text) {
    printf("%s%s\033[0m", color, text);
}

int main() {
    color_print("\033[1;31m", "这是红色加粗文本\n");
    color_print("\033[32;47m", "这是绿字白背景文本\n");
    return 0;
}

运行效果:

示例代码: 

#include <stdio.h>
#ifndef COLORS_H
#define COLORS_H
#define RESET   "\033[0m"
#define BOLD    "\033[1m"
#define RED     "\033[31m"
#define GREEN   "\033[32m"
#define YELLOW  "\033[33m"
#define BLUE    "\033[34m"
#define MAGENTA "\033[35m"
#define CYAN    "\033[36m"
#define WHITE   "\033[37m"
#endif
int main() {
    printf(BOLD RED "警告:" RESET "这是一条重要消息\n");
    printf("正常文本 " BLUE "蓝色文本" RESET " 又回到正常\n");
    return 0;
}

运行效果:

八、结束语 

        ANSI颜色编码作为终端显示的基石技术,自20世纪70年代诞生以来,历经数十年的发展依然焕发着强大生命力。通过本文的系统学习,您已经掌握了从基础8色到真彩色RGB的完整知识体系,以及在实际开发中的应用技巧。

       值得注意的是,随着技术的演进,现代终端已支持更丰富的特性,如真彩色、动画效果甚至图形混合。但万变不离其宗,这些高级功能都建立在本文介绍的基础规范之上。建议您在掌握基础后,可以进一步探索: 终端光标控制(制作进度条动画) 屏幕缓冲区操作(实现流畅的界面刷新) Unicode字符结合(创建更精美的界面元素)等技术。最后要强调的是,优秀的开发者应当始终秉持"功能优先,适度装饰"的原则。颜色的使用应当服务于功能需求,而非炫技手段。特别是在生产环境中,务必考虑不同终端设备的兼容性,以及特殊人群(如色盲用户)的可访问性。 

       在接下来的第二篇文章中,还会介绍有关ANSI颜色编码的进阶的应用,敬请期待。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值