終端機色彩代碼是介於 30 到 37、40 到 47、90 到 97,以及 100 到 107 之間的十進位 SGR (Select Graphic Rendition,選擇圖形呈現) 參數,用來在終端模擬器上選擇 16 個調色盤位置之一。它們被包在一個跳脫序列中,該序列以 ESC 控制位元組 (0x1B) 開頭,接著是左方括號、以分號分隔的參數值,以及結尾的 m,所以位元組串流看起來像 ESC[31m 表示紅色前景。基本的 8 種顏色位於 30-37 (前景) 和 40-47 (背景),依序為黑、紅、綠、黃、藍、洋紅、青、白,而相容於 xterm 的亮色 8 種則位於 90-97 和 100-107。ECMA-48 定義了 SGR 控制功能與基本的呈現參數,而 xterm 文件則交叉對照了被廣泛實作的亮色延伸。色彩編號選擇的是調色盤位置,而非保證的 RGB 值;實際的色相是由終端主題、使用者設定檔、輔助功能設定、多工器,或最終讀取串流的遠端環境所決定。

terminal color codes
terminal color codes

16 色調色盤及其 SGR 代碼

每個現代終端模擬器至少都實作了這 16 個調色盤位置,因為它們是由 ECMA-48 定義並在 xterm 控制序列參考中延伸而來。基本 8 色是 ECMA-48 原始的呈現參數;亮色 8 色則是相容於 xterm 的延伸,大多數 Linux 與 macOS 終端都會遵循,同時 Windows 主控台在啟用虛擬終端處理時也會支援。下表列出 ANSI Color Codes Generator 所搜尋並公開的所有代碼,左側為位置名稱,中間為前景代碼,右側為背景代碼。

Palette slotForegroundBackground
Black3040
Red3141
Green3242
Yellow3343
Blue3444
Magenta3545
Cyan3646
White3747
Bright black90100
Bright red91101
Bright green92102
Bright yellow93103
Bright blue94104
Bright magenta95105
Bright cyan96106
Bright white97107

有兩個樣式參數常見到足以與色彩並列。粗體是 SGR 1,底線是 SGR 4,重置是 SGR 0。斜體是 SGR 3,即使目前介面並未公開,它仍會保留在產生器的內部相容性邏輯中,所以來自其他工具的斜體代碼仍可被解析。除此之外的任何項目,包括 24 位元 truecolor 序列,都會被產生器刻意拒絕,以確保輸出保持 ECMA-48 與 xterm 相容。上方的色彩名稱描述的是調色盤位置,而非保證的 RGB 值,而位置對應可由接收端的主題、輔助功能設定檔、多工器,或遠端環境重新對應。

三步驟建立並複製序列

  1. 開啟 ANSI Color Codes Generator,在輸入欄位中輸入你想上色的文字,並從下拉選單中選擇選用的前景與背景。僅在確實需要時加入粗體或底線,因為每多一個參數就是多一個要傳送的位元組,也是多一個下游終端可能會有不同解讀的變數。
  2. 閱讀可見的跳脫表示法以驗證參數,例如 1;4;91;44 代表粗體、底線、亮紅色前景與藍色背景,並確認原始 SGR 串流看起來正確。可見形式會將跳脫位元組寫成 \x1b,因此當你預覽輸出時,頁面本身不會改變外觀。
  3. 點擊複製按鈕,將原始 ESC 位元組、參數列表、文字,以及結尾的 ESC[0m 重置放到剪貼簿,然後貼到支援終端的來源字串、測試樣本、紀錄樣板,或除錯情境中。請在目的終端、主題,以及使用者實際執行的輸出模式中測試重置行為與實際色相。

SGR 串流的結構

每個終端色彩序列都遵循相同的位元組模式:ESC 控制位元組 (0x1B,在紀錄中寫為 \x1b 或 ^[)、字面上的左方括號 [、一個或多個以分號分隔的十進位參數,以及作為 SGR 控制函式結尾的字母 m。ECMA-48 稱之為 CSI m 序列,其中 CSI 代表 Control Sequence Introducer (控制序列引入器)。以一個具體例子來說,位元組串流 ESC[1;4;91;44mHELLO 接著 ESC[0m,會以粗體、底線、亮紅色搭配藍色背景輸出 HELLO,然後重設圖形呈現,讓下一個字元回到一般樣式。

當參數堆疊時,順序並不會改變色彩本身的視覺結果,但樣式參數依慣例會放在最前面,以便日後除錯時易於閱讀串流。無論何時產生前綴,產生器都會自動附加重置 ESC[0m,因此後續的紀錄行較不容易繼承你的色彩。重置是一道護欄,並非保證每個消費者都會以完全相同的方式解讀串流;某些情境會遵守它,其他情境則可能不會,這就是為什麼純文字紀錄路徑仍然是合理的預設。

如果你想要更深入的格式規則,原始的 ECMA-48 第五版定義了 SGR 與呈現控制,而 xterm 控制序列參考則記錄了幾乎每個現代終端都實作的亮色延伸。如需搭配本概觀的動手操作教學,SGR 參數格式與安全處理指南以具體範例記錄了相同的跳脫規則。

代碼實際呈現的位置

這 16 個調色盤位置幾乎是通用的,但你在螢幕上看到的顏色並不受保證。SGR 編號選擇的是一個位置,而終端主題、使用者設定檔、輔助功能設定、多工器對應,或遠端環境會為該位置選擇實際的 RGB 值。在你的筆電上的亮紅色,在使用自訂調色盤的同事螢幕上可能看起來像橘色,而在會過濾掉控制位元組的 CI 紀錄檢視器中則可能完全消失。有些終端還會將粗體重新對應為亮度提高而非較粗的字型,而在少數較舊的終端上,粗體則會切換到亮色調色盤而非改變字重。底線的形狀與顏色也有類似的變化,而斜體支援在各實作中良莠不齊。

Windows 主控台僅在啟用虛擬終端處理時才會遵循這些代碼,而 NO_COLOR 慣例則可能在遵循該標準的工具中抑制它們。被重新導向的非互動輸出也可能會移除它們,所以一個將色彩列印到管線檔案的腳本,在接收端可能不會產生任何可見的樣式。瀏覽器無法告訴你上述哪一種適用於你的目標,因為頁面本身沒有終端模擬器,也無法判斷目的地是否支援 ECMA-48、xterm 延伸、Windows 虛擬終端、NO_COLOR,或管線 stdout。請務必在實際應用程式中測試,並為想要關閉色彩的使用者提供停用方式。

紀錄與共用輸出的安全處理

原始的跳脫位元組是控制資料,而非文字。將它們貼到命令列、紀錄檔、議題追蹤器、聊天視窗,或原始碼檔案中,可能會產生不可見的行為而非可讀的字元。在一行紀錄中,一個孤立的 CSI 序列就可能隱藏文字、偽造視覺換行、產生誤導性的連結,或干擾下一位讀取者的終端狀態。多年來有許多資料外洩正是利用了這個技巧,這就是為什麼成熟的紀錄函式庫通常會在控制位元組寫入磁碟前進行跳脫或移除,而互動式殼層則會在收到可疑輸入後積極重設狀態。

在將任何不受信任的輸入列印到互動式終端之前,請先進行淨化,並提供一個已移除或明顯跳脫控制序列的純文字紀錄路徑。包含 ESC[31m 的使用者名稱、提交訊息、檔名,或聊天訊息,絕不應該原樣出現在 CI 紀錄、共用終端工作階段,或複製的工單中。此產生器讓每個位元組都保留在你的瀏覽器本機,從不上傳或在任何殼層中執行任何東西,並公開可見的 \x1b 形式,正是為了讓你能在複製前先行檢視序列。對於不受信任的目的地,請在紀錄前移除 ESC 與 CSI,或仰賴預設就會這樣做,且為封存輸出提供明顯跳脫模式的紀錄函式庫。

如需更深入的說明,請參閱 ASCII Chart API Alternative: 128 Standard Codes Locally