在寫 CLI 工具或 debug 輸出時,你是否曾懷疑人生:
「我剛剛 print 的這坨資訊,為什麼看起來像一碗沒有配料的陽春麵?」
抱歉,我沒有要冒犯陽春麵的意思,我只是想說:
如果你也想讓終端機變得既有辨識性、又能一眼看到重點,那你需要認識一個低調卻強大的主角:
- ANSI Escape Code。
那是什麼?
ANSI,全文叫做 American National Standards Institute,這個組織負責制定各種標準,包括電腦的字元編碼。
ANSI Escape Code 是一組看起來很像亂碼的字元序列,這些序列長這樣:\033[ 或 \x1b[ 開頭,後面接上各種控制碼。
舉個例子:
print("\033[1;31mHello World\033[0m")
上面這段程式會輸出一行紅色粗體字「Hello World」,最後的 \033[0m 是 reset,防止你後面的輸出也被染紅。
常見格式控制碼
你可以用這些數值讓文字「穿」上各種樣式:
| 數值 | 效果 |
|---|---|
| 0 | Reset(素顏) |
| 1 | Bold(粗體) |
| 2 | Dim(低調) |
| 3 | Italic(斜一點) |
| 4 | Underline(底線) |
| 7 | Invert(反轉色) |
這些可以與顏色搭配使用,打造屬於你 CLI 的「個性穿搭」。
ANSI 控制碼冷知識:5 跟 6 去哪了?
其實它們一直都在,只是大部分人看不到。
- 5 = 慢閃(slow blink)
- 6 = 快閃(rapid blink)
不過……
幾乎沒終端機支援它們,尤其現代系統為了避免眼睛爆炸,幾乎都把 blink 效果關閉了。
你可以試試看:
print("\033[5;31m這是一段慢閃的紅字\033[0m")
如果它真的閃了,恭喜你,你的終端還活在上古年代 😅
顏色控制碼
ANSI Escape Code 中的文字顏色代碼通常為 30–37(標準色)與 90–97(亮色系)。
以下為對應表:
| 數值 | 顏色 |
|---|---|
| 30 | 黑色 |
| 31 | 紅色 |
| 32 | 綠色 |
| 33 | 黃色 |
| 34 | 藍色 |
| 35 | 品紅 |
| 36 | 青色 |
| 37 | 白色 |
| 90–97 | 亮色系列 |
而背景色控制碼則對應為 40–47(標準色)與 100–107(亮色系),也可同樣類推如下:
| 數值 | 背景顏色 |
|---|---|
| 40 | 黑色背景 (Black) |
| 41 | 紅色背景 (Red) |
| 42 | 綠色背景 (Green) |
| 43 | 黃色背景 (Yellow) |
| 44 | 藍色背景 (Blue) |
| 45 | 品紅背景 (Magenta) |
| 46 | 青色背景 (Cyan) |
| 47 | 白色背景 (White) |
| 100–107 | 對應亮色背景版 |
你可能會發現,38 到 89 之間幾乎沒人提 ── 那它們去哪了?
-
38 與 48:自定義色彩的進階用法
-
38= 開啟「自定義前景色」模式 -
48= 開啟「自定義背景色」模式這時候你需要再加參數指定顏色,例如 256 色(8-bit 模式):
print("\033[38;5;198m一段粉紅色文字\033[0m")38;5;198代表使用 256 色調色盤中的第 198 號色。
或是使用 True Color(24-bit 模式):
print("\033[38;2;255;105;180mHello in pink!\033[0m")38;2;<r>;<g>;<b>讓你精準指定 RGB 值。
-
-
39 與 49:reset 顏色的好朋友
39:還原預設前景色49:還原預設背景色
那 50 ~ 89 呢?
它們什麼都不是!
這段數值在 ANSI 規範裡沒有明確定義,屬於保留區或歷史空洞。少部分終端(例如某些 Konsole / xterm)有實驗性使用過,但都不是標準功能。
你硬塞這些數值下去,大多數終端不會理你。
所以,我們整理一下,色碼地圖大概就是這樣:
| 區間 | 功能 |
|---|---|
| 30–37 | 標準前景色 |
| 90–97 | 亮色前景 |
| 38 | 進階前景色(256 色 / RGB) |
| 39 | 還原前景色 |
| 40–47 | 標準背景色 |
| 100–107 | 亮色背景 |
| 48 | 進階背景色(256 色 / RGB) |
| 49 | 還原背景色 |
| 50–89 | ⚠️ 保留區,請勿輕易觸碰 |
寫一段程式來玩玩看吧:
for i in range(256):
print(f"\033[48;5;{i}m {i:3} \033[0m", end=" ")
if i % 16 == 15:
print()
執行後大概長得像這樣:
組合語法範例
使用語法格式:
\033[<格式>;<文字顏色>m
範例:
def colorstr(text, fmt=1, color=34):
return f"\033[{fmt};{color}m{text}\033[0m"
print(colorstr("這是一段藍色粗體文字"))
更潮一點:
print("\033[1;34;43m藍字配黃底,時尚不解釋\033[0m")
注意事項
使用時有幾個部分要注意,別讓你的彩色變災難:
- 一定要 reset:沒加
\033[0m,你的輸出就會一路繼承下去,從紅色悲劇變成紅色長篇小說。 - Jupyter 限制多:能顯示顏色,但游標或畫面控制基本是夢。
- Windows Terminal 已升級:新版終於有良心,舊版就用
colorama吧。 - Log 檔案別亂塞:除非你喜歡用正則表達式懲罰自己,不然建議儲存純文字版本。
延伸應用
你可以封裝自己的 color 工具模組,還能用 Enum 寫出更清爽的呼叫方式:
from enum import Enum
class COLOR(Enum):
RED = 31
GREEN = 32
BLUE = 34
class FORMAT(Enum):
BOLD = 1
UNDERLINE = 4
def colorstr(obj, color=COLOR.BLUE, fmt=FORMAT.BOLD):
return f"\033[{fmt.value};{color.value}m{obj}\033[0m"
應用場景:
- 錯誤與警告提示:用紅色說「這邊有問題」。
- 成功訊息:綠色的 Checkmark 就是爽。
- 互動選單提示:讓使用者知道該輸入什麼。
不想自己處理?
很多套件已幫你打包好了,我們可以直接拿來用。
參考以下幾個 Python 套件:
-
colorama解決跨平台顯示,Windows 小幫手,用法簡單:
from colorama import init, Fore, Style
init()
print(Fore.RED + "Hello in red!" + Style.RESET_ALL) -
termcolor提供
colored(),不囉嗦:from termcolor import colored
print(colored("Warning", "red", attrs=["bold"])) -
rich支援顏色、表格、進度條、Markdown,說它是 CLI 的 React 也不為過。
from rich import print
print("[bold red]This is a bold red text[/bold red]")
小結
掌握 ANSI Escape Code,就像給你的終端加上調色盤。
從 Debug 到 CLI 工具開發,你可以用最少的工具,做出最顯眼的效果。
更重要的是,讓使用者一眼看出「紅的是錯」、「綠的是過」、「黃的是等等再看」,不再迷失在一片黑白訊息中。
讓終端機的世界繽紛起來,從 贊助我持續分享 AI 實作、全端架構與開源經驗,讓好文章不斷更新。 從構想到上線,涵蓋顧問、開發與部署,全方位支援你的技術實作。 如果你需要客製服務或長期顧問,歡迎與我聯繫!\033[ 開始。☕ 一杯咖啡,就是我創作的燃料!
AI / 全端 / 客製 一次搞定
包含內容
🚀 你的專案準備好了嗎?
