Language
Memo
Home > Memo > Escape Chacter之應用-ANSI色彩

Home

Projects

Memo

Links

Contact







Escape Character之應用-ANSI色彩:

  其實跳脫字元「\」(Escape Character)本身有相當多種的用法,可以拿來表示tab(\t),可以拿來換行(\n)等等,或是在要輸入特殊符號時使用,總之,只要某個符號有代表特殊意義時,就要透過它來做進一步的轉換,這邊紀錄的是關於色碼的用法(ANSI escape sequence),如果有玩過BBS色碼的人對此應該不陌生才對,例:

在BBS上文章貼出去之後*[0;31m這串文字是紅色的*[m
在BBS上文章貼出去之後這串文字是紅色的

  這裡的「*」代表的是Escape這個字元(不是escape character "\",而是Escape本身,你可以想成是按了鍵盤上的Esc鍵一下後它傳入電腦的訊號),這個字元可以用\e來代表,所以說在其他程式語言裡只要依樣畫葫蘆組合Esc字元以及ANSI顏色的代碼就也能夠輸出彩色的文字。由於在各種語言中它的用法都差不多,所以我也不知道該不該放在個別語言的筆記頁面中,就先統整在這裡吧,可能未來再來修改。

  在開始動手前,對照此ASCII代碼表(http://www.asciitable.com/)可知Esc以八進位表示的值是033,十進位值為27,因為有些電腦可能不支援\e的用法,這時就要用這些值來代替了,使用\033跟使用\e的效果是一樣的,甚至要用任何語言的ASCII轉字元函數轉換都可以。

備註:以下所處環境除非有特別註明,不然作業環境都是在Linux底下。

1. BASH shell


  跟C語言一樣,跳脫字元為"\"符號,但在使用echo指令輸出時要注意,要加上-e參數才會啟動對跳脫字元的編譯:
# 原始碼
echo "
\033[1;33m這串是無效的,因為少了-e\033[m"
echo -e "\033[0;33m這串是一般的黃色,寫成[33m也行\033[m"
echo -e "\033[1;33m這串是亮黃色\033[m"
echo -e "\e[1;33m用\\\e雖然\\\e沒變色,但也沒問題\e[m"
# 執行結果(./color.sh):
這串是無效的,因為少了-e
這串是一般的黃色,寫成[33m也行
這串是亮黃色
用\e雖然\e沒變色,但也沒問題

2. C


  一樣在code裡面寫好Esc以及ANSI色碼即可:
// 原始碼
printf("\033[7;32m顏色反轉的綠色字\033[m");
printf("\e[1;4;32m有底線的亮綠色字\e[m");
//執行結果 (cc color.c; ./a.out):
顏色反 轉的綠色字
有 底線的亮綠色字

3. Fortran


  除了使用\033或是\e之外,也可以依據ASCII Table利用achar()來將Esc轉換出來:
! 原始碼
character:: ESC=achar(27)
print*,"\033[1;35;45m深紫底的紫色字\033[m"
print*,"\e[1;32m\\e的用法PGF不支援,但G77 ok"
print*,ESC//"[;33m配合ESC的用法"//ESC//"[m"
! 執行結果(pgf90 color.f90; ./a.out)
! Esc在ASCII Table中以十進位表示是27
深 紫底的紫色字
\e的用法PGF不支援,但G77 ok
配合ESC的用法

  結合色碼跟方塊可以弄出不少有趣的ASCII Art,可以放在進站畫面,或者是程式執行時的Logo等等。

ASCII_Art


4. Visual Basic


  VB或其他在Windows底下的編譯的語言,在應用上比較奇特一點,因為在Windows底下的命令提示字元中,並沒有辦法正確的顯示這些ANSI Color,要能夠正確顯示必須安裝ANSICON這類軟體。不過呢,經由這些程式輸出的結果,倒是可以直接貼進BBS裡面,貼上去的資料仍會保有正確的色碼設定。
  在VB裡要使用Esc這個字元只能靠ASCII轉換的方式:
' 假設有一個Form,上面有一個textbox叫做Textbox1,以下程式碼放在表單啟動時
Dim ESC As Char = Strings.Chr(27)
Me.TextBox1.Text = ESC & "[1;33mOK from  VB" & ESC & "[m"
' 表單啟動後,該Textbox之內容為:"
[1;33mOK from  VB [m"
' 要注意在"["符號前各有一空格,那就是Esc字元,把這串貼上BBS將會看到:
*[1;33mOK from  VB*[m

5. Python


  在Python裡面,如果想要作到跨平台的顯示可以考慮colorama這個套件,除此之外它的作法其實是一樣的:
>>> print "\033[1;32m我是亮綠色\033[m"
我是亮綠色
>>> print "\033[92m我也是亮綠色\033[m"
我也是亮綠色
>>> print u"\u001b[93m把\\033換成unicode也ok\u001b[m"
把\033換成unicode也ok

代碼表:


  在「[」到「m」之間可以放色碼、關於文字的表現方式,如下:
代碼
功能
1
亮色字
4 加底線
7 反轉顏色,將前景色、背景色互換
9 刪除線(BBS沒有)
 30  31  32  33  34  35  36  37
前景色
 40  41  42  43  44  45  46  47 
背景色
另外配合"1;"使用的亮色可以將色碼加上60來改寫,也就是1;31m可以寫成91m(不適用於BBS),這些代碼它們彼此以分號分隔,順序沒有關係,還有一些僅於某些機器上才支援的代碼可以到wiki上去看。

參考資料:
        http://en.wikipedia.org/wiki/ANSI_escape_code
        http://stackoverflow.com/questions/287871/print-in-terminal-with-colors-using-python


<-Memo
inserted by FC2 system