控制台终端输出颜色

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

控制台终端输出颜⾊
在使⽤putty、secureCRT、XShell等终端仿真器连接linux系统时,ls、vim等⼯具的输出都含有各种颜⾊,这些颜⾊的输出⼤⼤地增强了⽂本的可读性。

在bash中,通常我们可以使⽤echo命令加-e选项输出各种颜⾊的⽂本,例如:
echo -e "\033[31mRed Text\033[0m"
echo -e "\033[32mGreen Text\033[0m"
echo -e "\033[33mYellow Text\033[0m"
echo -e "\033[34mBlue Text\033[0m"
echo -e "\033[35mMagenta Text\033[0m"
echo -e "\033[36mCyan Text\033[0m"
可以分别输出:
Red Text
Green Text
Yellow Text
Blue Text
Magenta Text
Cyan Text
其中:"\033[31m"、"\033[31m"、"\033[0m"等是ANSI转义序列(ANSI escape code/sequence),它控制⽂本输出的格式、颜⾊等。

【注】:\033是键盘左上⾓Esc键对应的ASCII码(8进制),\033、\x1b和\e效果⼀样, 例如:echo -e "\x1b[31mRed Text\e[0m"也输出红⾊字体“Red Text”。

可以这样说,⽆论什么语⾔,只要你的终端能够解释ANSI转义序列(⼤多数的类unix终端仿真器都能够解释ANSI转义序列,win32控制台则不⽀持),就能够使⽤ANSI转义序列输出颜⾊。

下⾯给出⼏个⽰例。

⽰例1: C程序输出颜⾊⽰例
1 // hello.c
2 #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: C++程序中输出颜⾊⽰例
1 // hello.cpp
2 #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
⽰例3: Java程序中输出颜⾊⽰例
1 // hello.java
2 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
⽰例4: Python程序中输出颜⾊⽰例
1 # hello.py
2 print "\033[31;4mRed Underline Text\033[0m"
【注】:python(v2.6.5)中不能识别\e,可以使⽤\033和\x1b。

运⾏:python hello.py
输出:Red Underline Text
关于控制⽂本颜⾊的ANSI转义序列,下⾯给出更详尽的描述。

通⽤的控制⽂本颜⾊的转义序列格式如下:
CSI n1 [;n2 [;…]] m
其中CSI全称为“控制序列引导器”(Control Sequence Introducer/Initiator),也就是上述⽰例中的"\033[";n1、n2等表⽰SGR参数(下⾯会列出⼀些常⽤的SGR参数),⽤于控制颜⾊、粗体、斜体、闪烁等⽂本输出格式;m表⽰转义序列结束。

常⽤的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)更多参数信息请参考“”。

颜⾊表:
颜⾊值x01234567
颜⾊⿊红绿黄蓝紫青⽩
由于win32控制台不⽀持ANSI转义序列,因此要让win32控制台输出颜⾊⽂本相对复杂⼀些。

下⾯借助SetConsoleTextAttribute和GetStdHandle两个win32 API函数输出颜⾊,⽰例如下:
1 #include <stdio.h>
2 #include <windows.h>
3
4int 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 }
输出结果为“Hello world!”。

其中⽤到的两个API原型如下:
1 HANDLE GetStdHandle(DWORD nStdHandle);
2 BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);
其中,GetStdHandle⽤于获取屏幕缓冲区句柄(⽰例中获取的是标准输出的句柄),SetConsoleTextAttribute⽤于设置控制台⽂本属性(第⼀次调⽤时设置前景⾊为红⾊⾼亮,第⼆次调⽤时设置为绿⾊⾼亮)。

(1)GetStdHandle接⼝参数nStdHandle与接⼝返回值的含义如下:
值(nStdHandle)含义
STD_INPUT_HANDLE返回标准输⼊的句柄
STD_OUTPUT_HANDLE返回标准输出的句柄
STD_ERROR_HANDLE返回标准错误的句柄
【注】:更多信息请参考“”。

(2)SetConsoleTextAttribute()第⼀个参数hConsoleOutput为屏幕缓冲区句柄(可通过GetStdHandle()获取),第⼆个参数wAttributes为颜⾊属性。

常⽤颜⾊属性值如下(可组合使⽤):
属性(wAttributes)说明
FOREGROUND_BLUE前景⾊(蓝⾊)
FOREGROUND_GREEN前景⾊(绿⾊)
FOREGROUND_RED前景⾊(红⾊)
FOREGROUND_INTENSITY前景⾊⾼亮
BACKGROUND_BLUE背景⾊(蓝⾊)
BACKGROUND_GREEN背景⾊(绿⾊)
BACKGROUND_RED背景⾊(红⾊)
BACKGROUND_INTENSITY背景⾊⾼亮
【注】:
(1)更多信息请参考“”。

(2)上述中三种颜⾊(红、绿、蓝)可以按照“”混合成别的颜⾊,如下图所⽰:。

相关文档
最新文档