控制台終端輸出顏色


 在使用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)上述中三種顏色(紅、綠、藍)可以按照“加色法”混合成別的顏色,如下圖所示:

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM