2015年8月8日 星期六

[Linux C] ANSI逃脫碼與printf顏色教學


注意:Windows的console是不支援ANSI逃脫碼,想在Windows的console換色,本篇並不適合。
  •  ANSI逃脫碼介紹

 要在終端機(Console / Terminal )上印出顏色,其實是透過在console上印出一種叫做ANSI逃脫碼(ASCII Escape Code)來改變接下來輸出的文字結果。接下來我們實際抓一個例子來看逃脫碼怎麼用吧!


圖一、CSI標準格式

上圖就是CSI標準的格式,n1, n2是所謂的SGR (Select Graphic Rendition) parameters,這些數值只要上維基百科查詢一下其功能,將相對應的值填入就可以囉!而最後方的 m,查詢一下表格就可以發現,它是將前面設定的SGR設定輸出的意思。


注意:通常n1是填入 \x1b,為什麼呢?因為在ASCII TABLE內0x1B代表的就是escape,也就是所謂的逃脫字元!

圖二、ASCII TABLE - 0x1B



----


看完上面階段,想必大家還是霧煞煞這鬼東西到底怎麼用對吧?接下來就實際拿變色的陶托碼來講解吧!


下方是一個紅色且為粗體的逃脫碼。
\x1b[;31;1m

這鬼東西要怎麼拆開來看呢?

(1) \x1b : 這就跟上面解講得如同,0x1b代表著逃脫字元,代表的逃脫碼的開始。
(2) SGR 31 : 我們查詢一下SGR表裡面31代表什麼吧!

圖三、SGR 30-37
原來從30開始到37代表的是不同的顏色,而且設定對象是前景(foreground)的顏色!所以我們可以透過 30 + intensity 設定顏色。而intensity得值就要對應下面的Color Table啦!

圖四、Color table
所以 31 這個值就代表著紅色囉。

(3) SGR 1 : 我們來看一下SGR 1代表什麼功能吧!

圖五、SGR 1
如同上圖所敘述,SGR 1 代表的粗體。


所以我們將 \x1b[;31;1;m 組合起來就會變成 粗體紅色啦!是不是很簡單呢?



假如我們要使用粗體藍色,那麼該怎麼做呢?如法炮製就是使用\x1b[;34;1;m 就可以啦!

更詳細的參數請參閱:ANSI escape code WIKI


  •   實際操作

下面程式就是透過C語言來印出有顏色的字啦!

#include <stdio.h>



#define RED_BOLD "\x1b[;31;1m"

#define BLU_BOLD "\x1b[;34;1m"

#define YEL_BOLD "\x1b[;33;1m"

#define GRN_BOLD "\x1b[;32;1m"

#define CYAN_BOLD_ITALIC "\x1b[;36;1;3m"

#define RESET "\x1b[0;m"



int main(void)

{

 //* RED BOLD */

 printf(RED_BOLD"This line will be print out with color red and font bold.\n"RESET);



 //* BLU BOLD */

 printf(BLU_BOLD"This line will be print out with color blue and font bold.\n"RESET);



 //* YEL BOLD */

 printf(YEL_BOLD"This line will be print out with color yellow and font bold.\n"RESET);



 //* GRN BOLD */

 printf(GRN_BOLD"This line will be print out with color green and font bold.\n"RESET);



 //* CYAN BOLD */

 printf(CYAN_BOLD_ITALIC"This line will be print out with color cyan, font bold and italic.\n"RESET);



 return 0;

}


執行結果



我們可以看到成功變色啦!記得如果顏色改變之後如果沒有把顏色做RESET,直到有程式輸出RESET之前都會是該顏色哦!

而RESET得逃脫碼就是   \x1b[0m    啦~~

沒有留言:

張貼留言