跳到主要内容
ansicode

SGR 38;2;R;G;B — 24 位真彩色前景

直接指定 16,777,216 种 RGB 前景色之一。

字节形式

涵盖所有常见的字符串字面量写法,方便正反查找。

\\x1b[\x1b[38;2;R;G;Bm
\\033[\033[38;2;R;G;Bm
\\e[\e[38;2;R;G;Bm
ESC [ESC [ 3 8 ; 2 ; R ; G ; B m
hex1b 5b 33 38 3b 32 3b ... 6d

实时预览

在浏览器中通过与解码器相同的分词器渲染 —— 无需打开终端。

warm 255,100,50 cool 100,200,255 violet 180,120,255

说明

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)

示例

bash
printf '\033[38;2;255;128;0morange\033[0m\n'
python
print('\x1b[38;2;255;128;0morange\x1b[0m')
go
fmt.Print("\x1b[38;2;255;128;0morange\x1b[0m\n")
javascript
console.log('\x1b[38;2;255;128;0morange\x1b[0m')
c
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——值为 truecolor24bit 表示终端声明支持 24 位。$TERM-direct(如 xterm-directtmux-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
部分

相关序列

在家族食谱中

SGR 食谱 · 4. 真彩色 —— `\x1b[38;2;r;g;b m`