轉: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.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.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

 

2.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

 

2.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

 

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命令行輸出顏色(完全解析)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章