ANSI 色彩是終端機模擬器對應到 ECMA-48 所定義之 Select Graphic Rendition (SGR) 參數編號的十六個調色盤位置,ECMA-48 為規範文字樣式控制序列的標準。每個位置以整數定址:基本組中前景色為 30 至 37、背景色為 40 至 47,而 90 至 97 以及 100 至 107 則保留給 xterm 相容終端機所使用的常見亮色延伸。一個完整的 ANSI 色彩指令是由逸出字元 0x1B、左中括號、一個或多個以分號分隔的十進位參數,以及字母 m 所組成的短位元組序列。瀏覽器與大多數現代終端機皆以相同順序解讀這些編號,因此即便可見色彩由當前主題決定,由這些參數構成的序列仍會在不同環境中產生相同的邏輯樣式。

開發人員在需要彩色記錄檔、表達性豐富的 CLI 輸出、具有語法高亮的測試報告,或除錯固件中的樣式化文字時,皆會遇到 ANSI 色彩。其挑戰在於這些序列屬於控制位元組而非可列印文字,因此無法透過在一般文字欄位中輸入來編寫。專用的產生器是實際可行的方式來組合這些序列、檢查其結構,並將原始輸出複製到具備終端機感知的工具中。ANSI 色彩代碼產生器便處理此工作流程:它接受您要設定樣式的文字、讓您選擇選用的前景、背景、粗體或底線,並同時輸出供檢視的可見逸出表示,以及供剪貼簿使用的精確原始控制位元組。

what are ansi colors
what are ansi colors

ANSI 色彩究竟是什麼

ANSI 色彩系統是 ECMA-48 所標準化之更廣泛終端機控制序列系列中的一部分。該文件將 Select Graphic Rendition 定義為在不移動游標或編輯螢幕的情況下,變更終端機如何呈現後續字元的機制。SGR 是由參數驅動的:每個有意義的指令皆有一個數值代碼,而終端機則決定如何處理各代碼。色彩代碼僅是前景 30 至 37 與背景 40 至 47 的 SGR 參數,而 90 至 97 及 100 至 107 則為廣泛支援的亮色對應。ECMA-48 定義了基本的呈現控制項,而亮色對應則是記載於xterm 控制序列參考資料中的延伸功能。

其重要結果在於這些編號描述的是 16 位置調色盤中的位置,而非具體色彩。終端機、主題、無障礙設定、多工器或遠端環境,皆會選擇每個位置的實際 RGB 值。「亮紅色」序列意指「使用位置 91」,而位置 91 看起來是柔和粉紅、飽和的消防車紅,或高對比無障礙色調,完全取決於接收端的程式。承諾固定視覺色彩的工具有著標準所不支援的承諾,這正是為何該產生器公開參數與位置名稱而非色彩樣本的原因。

16 個標準色彩位置及其代碼

下表列出每個位置,及其基本前景 SGR 代碼、亮色前景 SGR 代碼、基本背景 SGR 代碼,以及亮色背景 SGR 代碼。位置順序為整個標準所使用的標準黑、紅、綠、黃、藍、洋紅、青、白序列。

位置名稱前景 基本前景 亮色背景 基本背景 亮色
Black309040100
Red319141101
Green329242102
Yellow339343103
Blue349444104
Magenta359545105
Cyan369646106
White379747107

前景與背景透過在相同的 SGR 序列中一併列出兩個參數來組合。樣式參數與其並列於同一個以分號分隔的清單中:粗體為參數 1、斜體為參數 3、底線為參數 4。終端機評估整個清單並套用每個效果,因此單一序列可同時承載粗體、底線、前景與背景,而無需巢狀逸出。

SGR 逸出序列的結構

一個完整的色彩指令包含四個結構部分。首先是 Control Sequence Introducer,寫為逸出位元組 0x1B 後接左中括號。接著是清單,以分號分隔的十進位參數,其中每個編號對應一個位置、一個樣式或一個重設。序列以字母 m 結尾,用以將該 introducer 識別為 Select Graphic Rendition。在 m 之後會出現樣式化文字,而最終的 ESC[0m 會清除該呈現設定,使後續輸出繼承乾淨狀態,而不會洩漏先前的樣式。

試考慮一個具體組合:亮紅色前景、藍色背景、粗體與底線。組合參數清單為 1;4;91;44,該產生器將其輸出為 ESC[1;4;91;44m,後接您的文字,以及 ESC[0m。可見的逸出表示會將逸出位元組寫成四個字元 backslash-x-1-b,以便可在瀏覽器中檢視結構,而不會變更頁面外觀;「複製」按鈕會將實際的單一位元組逸出置入剪貼簿,而非字面上的四個字元。由於每個參數皆為小整數,整個指令約僅佔十幾個位元組,可在管道、記錄檔及來源字串中傳遞,除須理解其為控制資料而非可列印文字外,無需特殊處理。

以三個步驟建立 ANSI 序列

ANSI 色彩代碼產生器會為文字、前景、背景、粗體與底線的任何組合產生控制位元組。無論最終序列將貼到何處,其工作流程皆相同,無論目的地是來源字串、除錯固件,或是轉送至真實終端機的記錄管道。

  1. 輸入終端機文字並選擇選用設定。在輸入區中輸入您要設定樣式的字面文字,然後視需要從標準 16 個位置中挑選前景與背景。若您的目標序列需要粗體或底線,請一併加入;將欄位留空則會完全省略該參數,並盡可能保持指令精簡。
  2. 產生序列並檢查兩種表示。該產生器會並排輸出兩種檢視。原始位元組會顯示實際的逸出字元、參數、文字及尾端重設;可見逸出檢視則顯示相同結構,但逸出位元組寫為 backslash-x-1-b,使您無需在瀏覽器中觸發控制行為即可驗證參數清單。交叉檢查參數清單是否恰好包含您選定的樣式且並無多餘,並確認重設出現在序列結尾。
  3. 將原始序列複製到受信任且具備終端機感知功能的環境中,並測試重設。使用「複製」按鈕將實際的控制位元組置入剪貼簿,然後將其貼入來源字串、固件、除錯工具或理解 ECMA-48 的終端機中。確認尾端的 ESC[0m 使後續輸出返回預設呈現設定。若下游程式未顯示預期色彩,則是接收主題正在重新對應該位置,而非產生器產生錯誤的代碼。

所有組合、驗證及剪貼簿作業皆在瀏覽器中完成;不會上傳任何內容,也不會執行任何 shell。不支援的色彩或樣式編號會立即遭到拒絕,因此產生的序列在目的地中不會悄悄退回到不同位置,而每當建立前綴時,產生器會附加重設,使後續終端機輸出不太可能從先前的行繼承格式。

限制、主題與記錄檔安全性

三項實際限制決定了每個 ANSI 色彩工作流程的樣貌。首先,代碼命名的是調色盤位置而非保證 RGB 值,因此在某個終端機中看起來是亮紅色的序列,在另一個終端機中可能看起來較為柔和、無障礙黃色,甚至是完全不同的色調。xterm 控制序列文件是跨終端機模擬器、多工器及遠端 shell 廣泛實作哪些參數編號的交叉查驗來源。其次,該產生器支援一組聚焦的樣式:粗體、邏輯相容中的斜體及底線,加上標準 16 色。粗體在現代終端機上通常選擇增強亮度而非較重的字形,而部分舊式終端機則使用粗體切換至亮色調色盤,這可能會在不改變參數清單的情況下變更可見色彩。

第三,原始逸出位元組屬於控制資料。將其貼入終端機命令列、議題追蹤器、聊天記錄或記錄檔中,可能產生不可見的行為:終端機狀態可能遭到擾亂、視覺行可能被偽造,而連結可能遭到誤導。可能含有不受信任輸入的記錄檔,在列印至互動式終端機之前,應先清除控制位元組,或提供明顯逸出的記錄路徑,以便移除控制序列或將其明確逸出。ECMA-48 第五版為 SGR 文法的權威來源,而僅以記載之參數為目標的產生序列則是最安全的基準。最精簡的參數集合、可見逸出表示的可見檢查、附加的重設,以及在實際目的地環境中的最終視覺檢查,是讓 ANSI 色彩工作流程在不同主題與平台間保持可預測性的四項防護措施。

延伸閱讀:如何在 Mac 上使用 ASCII 代碼:快速查詢參考

延伸閱讀:產生 ANSI 色彩代碼並複製原始 SGR 序列