在使用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轉義序列描述
關於控制文本顏色的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)更多參數信息請參考“ANSI escape code”。
顏色表:
| 顏色值x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 顏色 | 黑 | 紅 | 綠 | 黃 | 藍 | 紫 | 青 | 白 |
三、 win32控制台程序輸出顏色
由於win32控制台不支持ANSI轉義序列,因此要讓win32控制台輸出顏色文本相對復雜一些。
下面借助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 }
輸出結果為“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 | 返回標准錯誤的句柄 |
【注】:更多信息請參考“GetStdHandle”。
(2)SetConsoleTextAttribute()第一個參數hConsoleOutput為屏幕緩沖區句柄(可通過GetStdHandle()獲取),第二個參數wAttributes為顏色屬性。常用顏色屬性值如下(可組合使用):
| 屬性(wAttributes) | 說明 |
| FOREGROUND_BLUE | 前景色(藍色) |
| FOREGROUND_GREEN | 前景色(綠色) |
| FOREGROUND_RED | 前景色(紅色) |
| FOREGROUND_INTENSITY | 前景色高亮 |
| BACKGROUND_BLUE | 背景色(藍色) |
| BACKGROUND_GREEN | 背景色(綠色) |
| BACKGROUND_RED | 背景色(紅色) |
| BACKGROUND_INTENSITY | 背景色高亮 |
【注】:
(1)更多信息請參考“Console Screen Buffers”。
(2)上述中三種顏色(紅、綠、藍)可以按照“加色法”混合成別的顏色,如下圖所示:

