<計算機知識>:ANSI轉義序列以及輸出顏色字符詳解


之前對這類知識比較陌生,只知道一些皮毛而已,今天查了一些資料介紹,現在對ANSI和CSI的有一定的認知了,整理記錄一下。

轉義字符的由來

真實的硬件終端設備由鍵盤和顯示器組成,用於與遠程主機(計算機)進行通信。除了與主機距離比較遠(在隔壁房間或者在其它城市)以外,它的使用方式與一台個人計算機沒有什么區別。程序是在主機上被執行,但結果是顯示在終端屏幕上。終端通常僅限於顯示接收到的信息以及在鍵盤上輸入發送給主機的信息。
功能單一的終端設備在上世紀70年代和80年代比較盛行。人們在其上編制程序、運行程序、編寫文檔或發出打印命令等。終端使用一根電纜與主機相連,有時需要通過modem與在遠距離以外的主機連接。

如今使用實際的終端設備已經很少。人們通常利用軟件把個人計算機仿真成一個終端與主機相連。現在幾乎所有使用Linux的人都使用終端仿真方法。對於不使用X window的情況下,人們使用字符界面的終端(虛擬終端)。這通常也被稱為命令行接口。而在X window環境下,我們可以獲得多個終端窗口,也有不少的終端仿真程序可以選用,例如xterm、rxvt或者zterm等。所有這些都是使用了仿真的方法來模擬一台真實的終端設備。

實際的終端設備和與主機相連的顯示器不同,因為它們有不同的硬件設施。一個實際的字符終端通常通過一根長電纜連接到主機的串行端口上,而主機的顯示器則是連接在主機的顯示卡上的。對於主機的顯示器來講,其視頻圖象是保存在主機顯示卡上的顯示內存中,而終端設備顯示屏的圖象是保存在終端設備的功能簡單的顯示卡上的

為了能控制發送到終端的信息在屏幕上顯示的格式、位置等屬性,主機需要向終端發送控制碼(Control Code)和/或轉義字符序列(Escape Sequence)。

控制碼(或稱為控制字符 Control Character)是指ASCII碼表中前32個字符。這些控制字符包括:回車符(Carriage-Return)、換行符(Line-Feed)、退格符(Backspace)、逃逸符(轉義符Escape-Character)、制表符(Tab)和響鈴符(Bell)。這些控制字符本身通常不會顯示在終端屏幕上。

由於控制字符太少,遠遠不夠用來控制終端的各種屬性,因此發明出使用轉義序列來控制終端屬性的方法。轉義序列由轉義符(Escape – ESC)后跟普通字符序列組成。終端在收到一個轉義符時,就會把其后面的幾個字符當作主機發送的命令來對待,並對該字符序列作出詮釋。在識別出有效的轉義序列結束后,終端執行主機的控制命令。隨后所接收到的字符將仍然會顯示在屏幕上(除非它們也是控制字符或者轉義字符序列)。

ASC II碼表

我們輸入的顯示字符對於目前的系統而言都是ASC II的標准,了解這個有必要。對於一些特殊的指令,ASC II則用轉義字符更為方便。

​ ------------
​ Decimal Octal Hex Binary Value
​ 10 08 16 02


​ 000 000 000 00000000 NUL (Null char.)
​ 001 001 001 00000001 SOH (Start of Header)
​ 002 002 002 00000010 STX (Start of Text)
​ 003 003 003 00000011 ETX (End of Text)
​ 004 004 004 00000100 EOT (End of Transmission)
​ 005 005 005 00000101 ENQ (Enquiry)
​ 006 006 006 00000110 ACK (Acknowledgment)
​ 007 007 007 00000111 BEL (Bell)
​ 008 010 008 00001000 BS (Backspace)
​ 009 011 009 00001001 HT (Horizontal Tab)
​ 010 012 00A 00001010 LF (Line Feed)
​ 011 013 00B 00001011 VT (Vertical Tab)
​ 012 014 00C 00001100 FF (Form Feed)
​ 013 015 00D 00001101 CR (Carriage Return)
​ 014 016 00E 00001110 SO (Shift Out)SHIFT
​ 015 017 00F 00001111 SI (Shift In)
​ 016 020 010 00010000 DLE (Data Link Escape)
​ 017 021 011 00010001 DC1 (XON) (Device Control 1)
​ 018 022 012 00010010 DC2 (Device Control 2)
​ 019 023 013 00010011 DC3 (XOFF)(Device Control 3)
​ 020 024 014 00010100 DC4 (Device Control 4)
​ 021 025 015 00010101 NAK (Negative Acknowledgement)
​ 022 026 016 00010110 SYN (Synchronous Idle)
​ 023 027 017 00010111 ETB (End of Trans. Block)
​ 024 030 018 00011000 CAN (Cancel)
​ 025 031 019 00011001 EM (End of Medium)
​ 026 032 01A 00011010 SUB (Substitute)
​ 027 033 01B 00011011 ESC (Escape)
​ 028 034 01C 00011100 FS (File Separator)
​ 029 035 01D 00011101 GS (Group Separator)
​ 030 036 01E 00011110 RS (Request to Send/Record Separator)
​ 031 037 01F 00011111 US (Unit Separator)
​ 032 040 020 00100000 SP (Space)空格
​ 033 041 021 00100001 ! (exclamation mark)
​ 034 042 022 00100010 " (double quote)
​ 035 043 023 00100011 # (number sign)
​ 036 044 024 00100100 $ (dollar sign)
​ 037 045 025 00100101 % (percent)
​ 038 046 026 00100110 & (ampersand)
​ 039 047 027 00100111 ' (single quote)
​ 040 050 028 00101000 ( (left/opening parenthesis)
​ 041 051 029 00101001 ) (right/closing parenthesis)
​ 042 052 02A 00101010 * (asterisk)
​ 043 053 02B 00101011 + (plus)
​ 044 054 02C 00101100 , (comma)
​ 045 055 02D 00101101 - (minus or dash)
​ 046 056 02E 00101110 . (dot)
​ 047 057 02F 00101111 / (forward slash)
​ 048 060 030 00110000 0
​ 049 061 031 00110001 1
​ 050 062 032 00110010 2
​ 051 063 033 00110011 3
​ 052 064 034 00110100 4
​ 053 065 035 00110101 5
​ 054 066 036 00110110 6
​ 055 067 037 00110111 7
​ 056 070 038 00111000 8
​ 057 071 039 00111001 9
​ 058 072 03A 00111010 : (colon)
​ 059 073 03B 00111011 ; (semi-colon)
​ 060 074 03C 00111100 < (less than)
​ 061 075 03D 00111101 = (equal sign)
​ 062 076 03E 00111110 > (greater than)
​ 063 077 03F 00111111 ? (question mark)
​ 064 100 040 01000000 @ (AT symbol)
​ 065 101 041 01000001 A
​ 066 102 042 01000010 B
​ 067 103 043 01000011 C
​ 068 104 044 01000100 D
​ 069 105 045 01000101 E
​ 070 106 046 01000110 F
​ 071 107 047 01000111 G
​ 072 110 048 01001000 H
​ 073 111 049 01001001 I
​ 074 112 04A 01001010 J
​ 075 113 04B 01001011 K
​ 076 114 04C 01001100 L
​ 077 115 04D 01001101 M
​ 078 116 04E 01001110 N
​ 079 117 04F 01001111 O
​ 080 120 050 01010000 P
​ 081 121 051 01010001 Q
​ 082 122 052 01010010 R
​ 083 123 053 01010011 S
​ 084 124 054 01010100 T
​ 085 125 055 01010101 U
​ 086 126 056 01010110 V
​ 087 127 057 01010111 W
​ 088 130 058 01011000 X
​ 089 131 059 01011001 Y
​ 090 132 05A 01011010 Z
​ 091 133 05B 01011011 [ (left/opening bracket)
​ 092 134 05C 01011100 (back slash)
​ 093 135 05D 01011101 ] (right/closing bracket)
​ 094 136 05E 01011110 ^ (caret/cirumflex)
​ 095 137 05F 01011111 _ (underscore)
​ 096 140 060 01100000 `
​ 097 141 061 01100001 a
​ 098 142 062 01100010 b
​ 099 143 063 01100011 c
​ 100 144 064 01100100 d
​ 101 145 065 01100101 e
​ 102 146 066 01100110 f
​ 103 147 067 01100111 g
​ 104 150 068 01101000 h
​ 105 151 069 01101001 i
​ 106 152 06A 01101010 j
​ 107 153 06B 01101011 k
​ 108 154 06C 01101100 l
​ 109 155 06D 01101101 m
​ 110 156 06E 01101110 n
​ 111 157 06F 01101111 o
​ 112 160 070 01110000 p
​ 113 161 071 01110001 q
​ 114 162 072 01110010 r
​ 115 163 073 01110011 s
​ 116 164 074 01110100 t
​ 117 165 075 01110101 u
​ 118 166 076 01110110 v
​ 119 167 077 01110111 w
​ 120 170 078 01111000 x
​ 121 171 079 01111001 y
​ 122 172 07A 01111010 z
​ 123 173 07B 01111011 { (left/opening brace)
​ 124 174 07C 01111100 | (vertical bar)
​ 125 175 07D 01111101 } (right/closing brace)
​ 126 176 07E 01111110 ~ (tilde)
​ 127 177 07F 01111111 DEL (delete)


前32個控制字符的詳細解釋:

Seq 十進 十六進 縮寫 字符名
00 0x00 NUL Null (空)
^A 01 0x01 SOH Start of Heading (報頭開始)
^B 02 0x02 STX Start of Text (正文開始)
^C 03 0x03 ETX End of Text (正文結束)
^D 04 0x04 EOT End of Transmission (傳輸結束)
^E 05 0x05 ENQ Enquiry (查詢)
^F 06 0x06 ACK Acknowledge (確認)
^G 07 0x07 BEL Bell (振鈴)
^H 08 0x08 BS Backspace (退格)
^I 09 0x09 HT Horizontal Tab (水平制表)
^J 10 0x0A LF Line Feed (換行)
^K 11 0x0B VT Vertical Tab (垂直制表)
^L 12 0x0C FF Form Feed (換頁)
^M 13 0x0D CR Carriage Return (回車)
^N 14 0x0E SO Shift Out (移出)
^O 15 0x0F SI Shift In (移入)
^P 16 0x10 DLE Data Link Escape (數據鏈路轉義)
^Q 17 0x11 DC1 Device Control 1 (設備控制1)
^R 18 0x12 DC2 Device Control 2 (設備控制2)
^S 19 0x13 DC3 Device Control 3 (設備控制3)
^T 20 0x14 DC4 Device Control 4 (設備控制4)
^U 21 0x15 NAK Negative Acknowledge (否認)
^V 22 0x16 SYN Synchronous Idle (同步空閑)
^W 23 0x17 ETB End of Transmission Block (傳輸塊結束)
^X 24 0x18 CAN Cancel (取消)
^Y 25 0x19 EM End of Medium (介質結束)
^Z 26 0x1A SUB Substitute (替換)
^[ 27 0x1B ESC Escape (轉義)
^\ 28 0x1C FS File Separator (文件分隔符)
^] 29 0x1D GS Group Separator (分組符)
^^ 30 0x1E RS Record Separator (記錄分隔符)
^_ 31 0x1F US Unit Separator (單元分隔符)
127 0x7F DEL Delete (刪除)

ANSI轉義序列

轉義序列具有不同的長度,所有序列都以ASCII字符ESC(27 / 十六進制0x1B)開頭,第二個字節則是0x40–0x5F(ASCII @A–Z[\]^_)范圍內的字符。

標准規定,在8位環境中,這兩個字節的序列可以合並為0x80-0x9F范圍內的單個字節。但是,在現代設備上,這些代碼通常用於其他目的,例如UTF-8的一部分或CP-1252字符,因此並不使用這種合並的方式。

除ESC之外的其他C0代碼(通常是BEL,BS,CR,LF,FF,TAB,VT,SO和SI)在輸出時也可能會產生與某些控制序列相似或相同的效果。

按下鍵盤上的特殊鍵,以及輸出xterm CSI、DCS或OSC序列,常常用於產生從終端發送到計算機的CSI,DCS或OSC序列,就像用戶使用鍵盤輸入的一樣。

CSI序列

CSI序列由ESC [、若干個(包括0個)“參數字節”、若干個“中間字節”,以及一個“最終字節”組成。各部分的字符范圍如下:

組成部分 字符范圍 ASCII
參數字節 0x30–0x3F 0–9:;<=>?
中間字節 0x20–0x2F 空格、!"#$%&'()*+,-./
最終字節 0x40–0x7E @A–Z[\]^_a–z{

所有常見的序列都只是把參數用作一系列分號分隔的數字,如1;2;3。缺少的數字視為0(如1;;3相當於中間的數字是0,ESC[m這樣沒有參數的情況相當於參數為0)。某些序列(如CUU)把0視為1,以使缺少參數的情況下有意義:F.4.2。

一部分字符定義是“私有”的,以便終端制造商可以插入他們自己的序列而不與標准相沖突。包括參數字節<=>?的使用,或者最終字節0x70–0x7F(p–z{|}~)例如VT320(英語:VT320)序列CSI?25hCSI?25l的作用是打開和關閉光標的顯示。

當CSI序列含有超出0x20–0x7E范圍的字符時,其行為是未定義的。這些非法字符包括C0控制字符(范圍0–0x1F)、DEL(0x7F),以及高位字節。

選擇圖形再現(SGR)參數

代碼 作用 備注
0 重置/正常 關閉所有屬性。
1 粗體或增加強度
2 弱化(降低強度) 未廣泛支持。
3 斜體 未廣泛支持。有時視為反相顯示。
4 下划線
5 緩慢閃爍 低於每分鍾150次。
6 快速閃爍 MS-DOS ANSI.SYS;每分鍾150以上;未廣泛支持。
7 反顯 前景色與背景色交換。
8 隱藏 未廣泛支持。
9 划除 字符清晰,但標記為刪除。未廣泛支持。
10 主要(默認)字體
11–19 替代字體 選擇替代字體。
20 尖角體 幾乎無支持。
21 關閉粗體或雙下划線 關閉粗體未廣泛支持;雙下划線幾乎無支持。
22 正常顏色或強度 不強不弱。
23 非斜體、非尖角體
24 關閉下划線 去掉單雙下划線。
25 關閉閃爍
27 關閉反顯
28 關閉隱藏
29 關閉划除
30–37 設置前景色 參見下面的顏色定義。
38 設置前景色 下一個參數是5;n2;r;g;b,見下。
39 默認前景色 由具體實現定義(按照標准)。
40–47 設置背景色 參見下面的顏色定義。
48 設置背景色 下一個參數是5;n2;r;g;b,見下。
49 默認背景色 由具體實現定義(按照標准)。
51 Framed
52 Encircled
53 上划線
54 Not framed or encircled
55 關閉上划線
60 表意文字下划線或右邊線 幾乎無支持。
61 表意文字雙下划線或雙右邊線
62 表意文字上划線或左邊線
63 表意文字雙上划線或雙左邊線
64 表意文字着重標志
65 表意文字屬性關閉 重置6064的所有效果。
90–97 設置明亮的前景色 aixterm(非標准)。
100–107 設置明亮的背景色 aixterm(非標准)。

在編程中經常看到如:\033的轉義字符,使用情況具體意思如下:

轉義字符 說明
\033[0m 關閉所有屬性
\033[1m 設置高亮度
\033[4m 下划線
\033[5m 閃爍
\033[7m 反顯
\033[8m 消隱
\033[30m-\33[37m 設置前景顏色
\033[40m-\33[47m 設置背景顏色
\033[nA 光標上移n行
\033[nB 光標下移n行
\033[nC 光標右移n行
\033[nD 光標左移n行
\033[y;xH 設置光標位置
\033[2J 清屏
\033[K 清除從光標到行尾的內容
\034[s 保存光標位置
\033[u 恢復光標位置
\033[?25l 隱藏光標
\033[?25h 顯示光標

背景色:

40:黑 41:深紅 42:綠 43:黃色 44:藍色 45:紫色 46:深綠 47:白色

字體顏色:

30:黑 31:紅 32:綠 33:黃 34:藍色 35:紫色 36:深綠 37:白色

輸出字體顏色:

linux終端下輸出帶顏色的文字只需在文字前面添加如下格式

echo -e "\033[字背景顏色;文字顏色m字符串\033[0m"`

其中\033是ESC的八進制,\033[即告訴終端后面是設置顏色的參數,顯示方式,前景色,背景色均是數字

例如:
echo -e "\033[41;36m something here \033[0m"

其中41代表背景色, 36代表字的顏色

可以將所有控制參數都用上,也可以只使用前景色或背景色.

但有一點要注意,如果輸出帶顏色的字符后並沒有恢復終端默認設置,后續的命令輸出仍舊會采用之前的顏色,如果是在腳本中設置了顏色而未恢復,則整個腳本的輸出都會采用之前的顏色,因此如果不希望影響后面文字的輸出,最好是在輸出帶顏色的文字之后恢復終端默認設置,如下

如果想設置文字顏色:

echo -e "\033[30m 黑色字 \033[0m" 
echo -e "\033[31m 紅色字 \033[0m" 
echo -e "\033[32m 綠色字 \033[0m" 
echo -e "\033[33m 黃色字 \033[0m" 
echo -e "\033[34m 藍色字 \033[0m" 
echo -e "\033[35m 紫色字 \033[0m" 
echo -e "\033[36m 天藍字 \033[0m" 
echo -e "\033[37m 白色字 \033[0m"

如果是簡單設置背景顏色:

echo -e "\033[40;37m 黑底白字 \033[0m" 
echo -e "\033[41;37m 紅底白字 \033[0m" 
echo -e "\033[42;37m 綠底白字 \033[0m" 
echo -e "\033[43;37m 黃底白字 \033[0m" 
echo -e "\033[44;37m 藍底白字 \033[0m" 
echo -e "\033[45;37m 紫底白字 \033[0m" 
echo -e "\033[46;37m 天藍底白字 \033[0m" 
echo -e "\033[47;30m 白底黑字 \033[0m" 

內容參考:

  1. 作者:BigDipper https://www.jianshu.com/p/a924a6d6ed22
  2. 作者: andylauren https://blog.csdn.net/andylauren/article/details/52235512?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2
  3. 作者:wqqq https://zhidao.baidu.com/question/1815137.html
  4. 作者:咻一咻 https://blog.csdn.net/qq_37187976/article/details/79265667


免責聲明!

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



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