ANSI 顏色代碼是變更前景或背景調色板的 SGR 參數,而粗體與底線則是獨立的 SGR 樣式參數。ANSI 逸出代碼涵蓋更廣範的終端機操作,而 SGR 屬於 Select Graphic Rendition 系列,顏色參數只是其中的一部分。如果需求是移動游標、清除某個區域,或控制其他不涉及算繪的行為,加入顏色參數並無法解決該問題。如果需求是紅色狀態標籤、彩色背景、粗體強調或底線,則相關的 SGR 參數是解決方案的一部分。因此,這項決策分成兩個部分:先確認實際需要的視覺變更,再確認目的地可解譯 SGR 並支援顏色。ANSI 顏色代碼產生器可協助完成第一部分,方法是根據終端機文字以及選用的前景、背景、粗體與底線設定來建立序列。它也提供可搜尋的參考資料,涵蓋標準八色加上亮色八色的調色板位置。它不會檢查你的目的地,也不保證每個終端機都會顯示相同顏色,因此第二部分仍須測試實際的應用程式、終端機主題與輸出模式。

how do i decide whether i need to generate ansi color codes when using ansi escape codes
在 ANSI 逸出序列中需要 ANSI 顏色代碼嗎?

將顏色代碼與其他 ANSI 控制項區分開

ANSI 逸出序列是一項控制指令,並非每項指令都會變更顏色或文字樣式。SGR 控制圖形呈現,前景顏色、背景顏色、粗體與底線皆由特定參數表示。移動游標或清除顯示內容的序列處理的是另一項工作,因此為其加入顏色參數,充其量只是冗餘,最糟的情況還可能造成誤導。

在 SGR 序列中,顏色代碼也是選用的。粗體與底線同樣使用 SGR 參數,因此序列可以在未選取任何前景或背景顏色的情況下強調文字。反過來說,選擇前景或背景是變更調色板位置,而非保證取得特定的 RGB 值。產生器著重於這項範圍較窄的格式設定決策,而不會建立無關的終端機控制項。

每個產生的序列都使用一個 CSI m 前置碼,將提供的文字置於其後,並附加 ESC[0m 以重設圖形呈現。該重設是一道防護措施,可降低後續終端機輸出沿用格式設定的機率;但這並不能證明每個終端機或應用程式都會以相同方式解譯該串流。

將預期結果轉換為具體選擇

開啟產生器之前,請先用一般語言描述所需的結果。最小且有效的選擇通常可直接從該描述得出。

情境 相關選擇 應選取項目 重要注意事項
狀態標籤需要紅色前景 前景顏色 選擇前景,除非另有需要,否則省略背景 調色板位置的實際外觀由終端機主題決定
面板需要對比色 前景與背景 選擇兩種顏色 主題與使用者設定可以重新對應兩個位置
警告需要更強的強調 粗體 選擇粗體,不要無謂地加入顏色 粗體可能提高亮度,而非選取較粗的字型
標籤需要底線 底線 單獨選擇底線,或搭配其他必要的樣式 底線的形狀與顏色可能因終端機而異
輸出必須移動游標或清除某個區域 不使用顏色代碼 使用適當的非顏色終端機控制項 此產生器會建立 SGR 呈現序列,而非一般終端機控制序列
輸出是供人閱讀的日誌 通常不使用原始樣式 移除控制序列,或讓它們以可見的逸出形式顯示 原始控制資料可能扭曲日誌或終端機狀態
使用者或應用程式已停用顏色 不使用前景或背景顏色 遵循目的地的偏好設定 產生器無法偵測這項設定

此工具可以建立支援的 SGR 組合,以表達已明確說明的視覺需求。它無法決定是否應將該組合傳送至目的地。第二項決策取決於應用程式、終端機、使用者偏好與輸出通道。

產生並測試合適的顏色序列

  1. 輸入確切的終端機文字。 這段文字會置於開頭的 SGR 序列與重設之間。請將其保持簡短,足以辨識輸出中預期的部分。
  2. 只選擇必要的前景、背景、粗體與底線設定。 當輸出只需強調或完全不需要樣式時,請將前景與背景維持未設定。目前的介面提供粗體與底線;不支援的樣式與顏色編號會遭到拒絕,而不會在未告知的情況下被接受。
  3. 產生序列並檢查兩種輸出。 檢視可見的逸出表示與 SGR 參數。可見表示會將逸出位元組寫成 \x1b,讓你能在不變更瀏覽器頁面外觀的情況下檢查控制結構。此頁面刻意避免使用可能暗示通用終端機調色板的虛假顏色預覽。
  4. 只將原始序列複製到值得信任且支援終端機的環境中。 複製按鈕會將實際的 ESC 控制位元組、SGR 參數、文字與重設放進剪貼簿,而不是拼出 \x1b 的四個可見字元。請在適合的來源字串、支援終端機的工具、測試資料或除錯工作流程中使用,而不要隨意貼到任何地方。
  5. 在實際應用程式中測試序列及其重設。 確認只有預期的文字取得格式設定、後續輸出恢復正常,且結果在相關終端機主題與輸出模式中運作正確。如果應用程式支援樣式化輸出,請提供讓使用者停用顏色的方式。

讓調色板選擇與 SGR 參數相符

ECMA-48 第五版定義了 SGR 與基本呈現控制項,而xterm 控制序列文件則用來交叉檢查廣泛實作的亮色對應。產生器在可搜尋的 16 色參考資料中,明確列出每個前景與背景代碼。

調色板位置 基本前景 亮色前景 基本背景 亮色背景
黑色309040100
紅色319141101
綠色329242102
黃色339343103
藍色349444104
洋紅色359545105
青色369646106
白色379747107

這些名稱描述的是調色板位置,而非保證的 RGB 值。終端機模擬器、主題、使用者設定檔、無障礙設定、多工終端機、遠端環境與應用程式都可能重新對應它們。粗體可能選擇提高亮度,而非選取較粗的字型;部分較舊的終端機則使用粗體來存取亮色調色板。底線的形狀與顏色也會因使用端而異。

例如,藍色背景上的亮紅色標籤若同時使用粗體與底線,會使用 SGR 參數 1;4;91;44。其可見的逸出形式為 \x1b[1;4;91;44mLabel\x1b[0m:前置碼選取兩種樣式與顏色,標籤緊接在後,而重設則結束格式化範圍。

測試目的地,而不只是產生器

產生器不含終端機模擬器,因此無法判斷目的地是否支援 ECMA-48、xterm 亮色延伸功能、Windows 虛擬終端機處理、NO_COLOR 慣例,或重新導向的非互動式輸出。在某個互動式終端機中正確顯示的序列,在輸出被重新導向、篩選,或由不會傳遞控制序列的應用程式處理時,仍可能以純文字顯示。

請在每個與你的使用者相關的模式中測試實際的應用程式。檢查一般終端機主題、任何替代的高對比或無障礙設定,以及非互動式輸出路徑。此外,也要驗證重設能防止後續輸出沿用格式設定,並確認應用程式能依要求停用顏色。這些檢查可回答決策的後半部分:不僅是序列在語法上是否適合,還包括樣式化輸出是否適合該目的地。

讓原始序列遠離不可信賴的日誌

原始逸出位元組是控制資料,而非一般可列印字元。將其貼入終端機命令列、日誌、議題、聊天或來源檔案,可能產生不可見的行為,而非可讀的字元。不可信賴的控制字元可能隱藏文字、偽造視覺行、建立誤導性連結,或破壞終端機狀態。在將不可信賴資料印到互動式終端機前,請先加以清理,並提供純文字日誌路徑,讓控制序列被移除或以可見的逸出形式顯示。如需進一步了解這些風險,請參閱在日誌中安全處理 ANSI 逸出序列。

產生器的文字、選擇項目、產生的位元組、搜尋字詞與剪貼簿作業都保留在瀏覽器中。沒有任何內容會被上傳或在 shell 中執行,但這仍不代表將逸出序列插入不可信賴的輸出串流是安全的。安全性仍取決於複製的序列會送往何處,以及接收系統如何處理控制字元。

使用可重複的顏色代碼決策

在將 ANSI 顏色代碼加入逸出序列之前,套用以下檢查清單:

  • 以淺顯易懂的語言說明所需的視覺結果。
  • 將文字呈現需求與游標、螢幕或其他終端機控制需求分開處理。
  • 確認目的地支援 SGR,且顏色功能未被停用。
  • 除非前景色、背景色、粗體及底線設定有助於達成所述結果,否則所有選用設定均保持未設定。
  • 複製之前,檢查可見的逸出表示法與 SGR 參數。
  • 僅將原始序列複製到值得信任且支援終端機的環境中。
  • 在實際應用程式中驗證格式、重設效果及後續輸出。
  • 清理不受信任的終端機內容,並保留純文字記錄選項。

若這些檢查皆通過,即可產生最小且適當的 SGR 序列。若目的地不需要、不支援、不允許或不安全使用該顏色,則應省略顏色參數,但不得移除任何獨立需要的粗體或底線樣式。

若你正在權衡各種選項,Code Snippet Image Maker: PNG Rendering Explained 有詳細說明。