SGR 38;2;R;G;B — 24 位真彩色前景
直接指定 16,777,216 种 RGB 前景色之一。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[38;2;R;G;Bm\033[38;2;R;G;Bm\e[38;2;R;G;BmESC [ 3 8 ; 2 ; R ; G ; B m1b 5b 33 38 3b 32 3b ... 6d实时预览
在浏览器中通过与解码器相同的分词器渲染 —— 无需打开终端。
说明
SGR 38;2;R;G;B 直接指定 16,777,216 种 RGB 前景色之一 —— R、G、B 各取 0–255。背景等价形式:\x1b[48;2;R;G;Bm。形态出自 ITU-T T.416(「Direct color」),被 xterm-ctlseqs 采纳为事实标准的真彩色 SGR。多数解析器同时接受分号形式(xterm 传统,支持广泛)与符合 ECMA-48 的冒号形式 \x1b[38:2::R:G:Bm —— 注意第 4 个子参数为空,T.416 为色彩空间标识符保留。默认发分号;冒号更安全的前提是你确认消费端能处理(有些库会拒绝空子参数)。和 SGR 30–37 不同,渲染颜色就是你指定的 RGB —— 不依赖主题 —— 这正是使用真彩色的全部理由。
2026 年的移植性断层就在真彩色这一层。应用应当检查的探测信号是 $COLORTERM=truecolor(或 24bit);没有就回落到 256 色量化或基础 16 色,因为并非每个栈都能渲染 24 位字节。具体陷阱:(1)xterm 始终解析 24 位 SGR,但不导出 $COLORTERM=truecolor —— 依赖该环境变量的库(chalk、colorama、click)会在 xterm 上悄悄降级到 256 色,虽然 xterm 本身完全接受字节;(2)Apple Terminal.app 自 10.7 Lion(2011)起渲染真彩色但同样不设 $COLORTERM,同样的降级 —— 由于偏好面板没有开关,请在 shell 初始化里手动设置;(3)tmux 会把真彩色量化到 256 色,除非在 ~/.tmux.conf 里加 set -g default-terminal "tmux-256color" + set -ga terminal-overrides ",*256col*:Tc"(或较新的 ,*:RGB);(4)Linux console / fbcon 与 Windows conhost.exe 都量化到 16 色;(5)GNU screen 早于 5.0.0(2024 年 4 月)会静默量化 —— Ubuntu 22.04 装 4.09,Apple /usr/bin/screen 是 2006 年的 v4.00.03。探测小结:$COLORTERM=truecolor + infocmp $TERM | grep -E '(Tc|RGB)' 是发送前最稳的测试(见 truecolor-detect)。
关闭前景色用 \x1b[39m —— 恢复终端默认,不动背景与其他属性。精准关闭对是 \x1b[38;2;R;G;Bm…\x1b[39m;用 \x1b[0m 会抹掉你设置的其他属性,根本不发重置则会把颜色泄漏到用户的命令提示符(见 color-bleed)。需要在更多多路复用器跳转中存活而不被量化的索引调色板,见 sgr-fg-256;需要在 Linux console 到旧式 conhost 上都能渲染的 16 个基础槽位,见 sgr-fg-basic;对应的背景一侧见 sgr-bg-truecolor。真彩色在现代终端(iTerm2、kitty、alacritty、wezterm、ghostty、Windows Terminal、近版 gnome-terminal / konsole)上是合适的默认,但务必配上 $COLORTERM 检查,免得在会量化的栈上把回退路径搞坏。
规范出处: ITU-T T.416 / xterm-ctlseqs (Direct color)
示例
printf '\033[38;2;255;128;0morange\033[0m\n'print('\x1b[38;2;255;128;0morange\x1b[0m')fmt.Print("\x1b[38;2;255;128;0morange\x1b[0m\n")console.log('\x1b[38;2;255;128;0morange\x1b[0m')printf("\x1b[38;2;255;128;0morange\x1b[0m\n");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- bat, delta (TrueColor themes)现代语法主题假定 24 位色——若终端不支持则颜色会塌缩
- gh (GitHub CLI) — branded reds and greens
- vim, neovim with `set termguicolors`把所有 highlight group 从 cterm 切到 GUI 24 位色
- starship — branded prompt segments
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- 怎样检测终端是否支持 24 位真彩色?
- 查
$COLORTERM——值为truecolor或24bit表示终端声明支持 24 位。$TERM含-direct(如xterm-direct、tmux-direct)是 terminfo 侧的信号。两者都没设时,回退到 256 色(\x1b[38;5;Nm)或基本 16 色。参见truecolor-detect误区条目。 38;2后面的参数该用;还是:?- 两种都被多数现代终端接受。
\x1b[38;2;255;100;50m(分号)是 xterm 风格的扁平参数表,所有终端都认。\x1b[38:2::255:100:50m(带色彩空间槽位的冒号写法)是 ITU T.416 / ECMA-48 的子参数形式——kitty、alacritty、wezterm、ghostty 接受;老终端不接受。为兼容性请用分号。 - 为什么我的平滑渐变在 macOS Terminal.app 上有色带?
- Terminal.app 与 Linux 控制台会先把真彩色量化到 256 或 16 调色板再渲染,相邻的微小 RGB 差异会塌缩到同一个色块上。修复方式在渲染端:通过
$COLORTERM检测无真彩色支持时,提前把渐变量化到 256 色并用更稀疏的色阶。参见truecolor-fallback-banding。
终端支持
- xterm
- 支持
- Linux console (fbcon)
- 不支持
- macOS Terminal.app
- 部分
- iTerm2
- 支持
- Windows Terminal
- 支持
- cmd.exe / ConPTY
- 部分
- kitty
- 支持
- alacritty
- 支持
- WezTerm
- 支持
- Ghostty
- 支持
- GNOME Terminal
- 支持
- Konsole
- 支持
- tmux
- 部分
- GNU screen
- 部分
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 部分 | 支持 | 支持 | 部分 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 部分 | 部分 |