首页 > 代码库 > Linux终端和win32控制台文本颜色输出
Linux终端和win32控制台文本颜色输出
在使用putty、secureCRT、XShell等终端仿真器连接linux系统时,ls、vim等工具的输出都含有各种颜色,这些颜色的输出大大地增强了文本的可读性。
通常我们可以使用echo命令加-e选项输出各种颜色的文本,例如:echo -e "\033[31mRed Text\033[0m",可以输出红色的字体“Red Text”。其中:"\033[31m"和"\033[0m"是ANSI转义序列(ANSI escape code/sequence),它控制文本输出的格式、颜色等,大多数的类unix终端仿真器都能够解释ANSI转义序列。
1. ANSI颜色序列格式
通用的控制文本颜色的转义序列格式如下:
CSI n1 [;n2 [;…]] m
其中CSI全称为“控制序列引导器”(Control Sequence Introducer/Initiator),也就是上述示例中的"\033["(其中\033是你键盘左上角Esc键对应的ascii码(八进制));n1、n2等表示SGR参数(下面会列出一些常用的SGR参数),用于控制颜色、粗体、斜体、闪烁等文本输出格式;m表示转义序列结束。
注:\033是键盘左上角Esc键对应的ASCII码(8进制),\033、\x1b和\e效果一样, 例如:echo -e "\x1b[31mRed Text\e[0m"也输出红色字体“Red Text”。
常用的SRG参数列表如下:
编码 | 说明 |
0 | 关闭所有格式,还原为初始状态 |
1 | 粗体/高亮显示 |
2 | 模糊(※) |
3 | 斜体(※) |
4 | 下划线(单线) |
5 | 闪烁(慢) |
6 | 闪烁(快)(※) |
7 | 交换背景色与前景色 |
8 | 隐藏(伸手不见五指,啥也看不见)(※) |
30-37 | 前景色,即30+x,x表示不同的颜色(参见下面的“颜色表”) |
40-47 | 背景色,即40+x,x表示不同的颜色(参见下面的“颜色表”) |
注:(1)其中含有(※)标注的编码表示不是所有的终端仿真器都支持,只有少数仿真器支持。
(2)多个SGR参数可以组合使用,例如:echo -e "\x1b[31;4mRed Underline Text\e[0m"输出红色下划线字体“Red Underline Text”。
(3)更多参数信息请参考“ANSI escape code”。
颜色表:
颜色值x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
颜色 | 黑 | 红 | 绿 | 黄 | 蓝 | 紫 | 青 | 白 |
2. 各种语言输出颜色文本示例
除了shell命令可输出颜色,其它语言中也可以使用上述ANSI转义序列输出颜色(前提是你使用的终端仿真器能够解析ANSI转义序列),以下给出几种主要语言中输出颜色文本的示例。
注:以下程序仅针对类unix终端有效,win32控制台不支持ANSI转义序列,因而无效。
2.1 C程序输出颜色示例
1 // hello.c2 #include <stdio.h>3 int main() {4 printf("\033[31;4mRed Underline Text\033[0m\n");5 }
编译:gcc hello.c
运行:./a.out
输出:Red Underline Text
2.2 C++程序中输出颜色示例
1 // hello.cpp2 #include <iostream>3 int main() {4 std::cout << "\033[31;4mRed Underline Text\033[0m" << std::endl;5 }
编译:g++ hello.cpp
运行:./a.out
输出:Red Underline Text
2.3 Java程序中输出颜色示例
1 // hello.java2 class hello {3 public static void main(String[] args) {4 System.out.println("\033[31;4mRed Underline Text\033[0m");5 }6 }
注:Java中不能识别\e和\0x1b,仅可使用\033。
编译:javac hello.java
运行:java hello
输出:Red Underline Text
2.4 Python程序中输出颜色示例
1 # hello.py2 print "\033[31;4mRed Underline Text\033[0m"
注:python(v2.6.5)中不能识别\e,可以使用\033和\x1b。
运行:python hello.py
输出:Red Underline Text
3. win32控制台程序输出颜色
由于win32控制台不支持ANSI转义序列,因此要让win32控制台输出颜色文本相对复杂一些。
3.1 C/C++ windows程序控制台输出颜色
借助SetConsoleTextAttribute和GetStdHandle两个win32 API函数输出颜色,示例如下:
1 #include <stdio.h> 2 #include <windows.h> 3 4 int main() { 5 HANDLE hdl = GetStdHandle(STD_OUTPUT_HANDLE); 6 SetConsoleTextAttribute(hdl, FOREGROUND_RED | FOREGROUND_INTENSITY); 7 printf("Hello "); 8 SetConsoleTextAttribute(hdl, FOREGROUND_GREEN | FOREGROUND_INTENSITY); 9 printf("world!\n");10 11 getchar();12 }
其中用到的两个API原型如下:
1 HANDLE GetStdHandle(DWORD nStdHandle);2 BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);
其中,GetStdHandle用于获取屏幕缓冲区句柄(示例中获取的是标准输出的句柄),SetConsoleTextAttribute用于设置控制台文本属性(第一次调用时设置前景色为红色高亮,第二次调用时设置为绿色高亮),因此输出结果为“Hello world!”。
GetStdHandle接口参数nStdHandle与接口返回值的含义如下:
值(nStdHandle) | 含义 |
STD_INPUT_HANDLE | 返回标准输入的句柄 |
STD_OUTPUT_HANDLE | 返回标准输出的句柄 |
STD_ERROR_HANDLE | 返回标准错误的句柄 |
注:更多信息请参考“GetStdHandle”。
SetConsoleTextAttribute()第一个参数hConsoleOutput为屏幕缓冲区句柄(可通过GetStdHandle()获取),第二个参数wAttributes为颜色属性。常用颜色属性值如下(可组合使用):
属性(wAttributes) | 说明 |
FOREGROUND_BLUE | 前景色(蓝色) |
FOREGROUND_GREEN | 前景色(绿色) |
FOREGROUND_RED | 前景色(红色) |
FOREGROUND_INTENSITY | 前景色高亮 |
BACKGROUND_BLUE | 背景色(蓝色) |
BACKGROUND_GREEN | 背景色(绿色) |
BACKGROUND_RED | 背景色(红色) |
BACKGROUND_INTENSITY | 背景色高亮 |
注:更多信息请参考“Console Screen Buffers”。
3.2 命令提示符下调整整屏颜色
命令提示符(CMD)下调整整屏颜色输出可使用color命令,格式如下:
color BF
其中B和F表示颜色属性(B背景色,F前景色),属性值为一个十六进制数字(0-F)。各属性值与颜色对应的关系如下:
属性值 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
颜色 | 黑 | 蓝 | 绿 | 水绿 | 红 | 紫 | 黄 | 白 |
属性值 | 8 | 9 | A | B | C | D | E | F |
颜色 | 灰 | 淡蓝 | 淡绿 | 淡水绿 | 淡红 | 淡紫 | 淡黄 | 亮白 |
例如,要设置命令提示符窗口“背景色为绿色,前景色为蓝色”可执行“color 21”。
3.3 PowerShell下输出字符颜色
可参考:PowerShell输出字符颜色
3.4 Python绑定windows接口输出显色
可参考:Python实现修改Windows CMD命令行输出颜色(完全解析)
Linux终端和win32控制台文本颜色输出