SGR 38;5;n — 256 色前景
从 xterm 256 色调色板中选择前景色。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[38;5;Nm\033[38;5;Nm\e[38;5;NmESC [ 3 8 ; 5 ; N m1b 5b 33 38 3b 35 3b <N> 6d实时预览
在浏览器中通过与解码器相同的分词器渲染 —— 无需打开终端。
说明
SGR 38;5;N 从 xterm 256 色调色板中选择前景色。N 取 0–255:0–7 对应 8 种基础色,8–15 对应高亮变体,16–231 构成 6×6×6 RGB 立方体(公式 16 + 36*r + 6*g + b,r/g/b 各取 0–5),232–255 是 24 级灰阶(从近黑到近白)。背景等价形式:\x1b[48;5;Nm。规范源流:参数形态出自 xterm-ctlseqs(不直接来自 ECMA-48 —— ECMA-48 把 38 与 48 保留为「未来使用」,让实现自选子参数语法)。大多数解析器同时接受分号形 \x1b[38;5;Nm(xterm 传统)与符合 ECMA-48 的冒号形 \x1b[38:5:Nm —— 默认发分号;冒号更安全的前提是你确认消费端(部分库)能正确处理。
256 色的全部故事就是移植性。Linux console / fbcon 完全忽略 \x1b[38;5;Nm(调色板被固定为 16 个基础 + 高亮槽位)—— 任何 256 索引色都会被静默量化到 16 色中最近邻。Apple 的 /usr/bin/screen(截至 macOS Sequoia 仍是 2006 年的 v4.00.03)以及 Ubuntu 22.04 / Debian Bookworm 的 screen 4.09 也会丢弃未识别的 256 色字节;多路复用器先解释再转发,旧版 screen 从未学过这个形态。Windows conhost.exe(旧式 cmd 宿主,不是现代 Windows Terminal)量化到 16 色控制台槽位 —— ConPTY 在 1809+ 上透传字节不变,但上层渲染层做量化。tmux 内部 \x1b[38;5;Nm 能穿过多路复用器(只有真彩色 38;2;… 需要 Tc/RGB terminfo 能力)。可移植特性探测:$TERM 包含 256color 加上 tput colors ≥ 256 —— 不要靠 $COLORTERM 判断 256 色(它是真彩色信号)。
关闭前景色用 \x1b[39m —— 恢复终端默认,不动背景与其他属性。精准关闭对是 \x1b[38;5;Nm…\x1b[39m;用 \x1b[0m 会同时抹掉你设置的加粗 / 斜体 / 背景。换行前别忘了重置,否则颜色会污染到用户的命令提示符(见 color-bleed)。需要超出 256 色调色板的任意 RGB 控制,见 sgr-fg-truecolor(24 位,现代终端无量化);需要在 Linux console 到旧式 conhost 上都能渲染的 16 个基础 + 高亮槽位,见 sgr-fg-basic;对应的背景一侧见 sgr-bg-256。256 色立方体是「需要不依赖主题但要最大移植性」时的合理默认 —— 它是在不被量化的前提下能穿过多数多路复用器 + 旧式终端的最大调色板,真彩色则作为现代栈上的升级方案。
规范出处: xterm-ctlseqs (256-color extension)
示例
for n in 16 51 196 226 51 21 201; do printf "\033[38;5;${n}m■\033[0m"; done; echofor n in [16, 196, 226, 21, 51, 201]: print(f'\x1b[38;5;{n}m■\x1b[0m', end='')for _, n := range []int{16,196,226,21,51,201} { fmt.Printf("\x1b[38;5;%dm■\x1b[0m", n) }[16,196,226,21,51,201].forEach(n => process.stdout.write(`\x1b[38;5;${n}m■\x1b[0m`))int n[] = {16,196,226,21,51,201}; for (int i=0;i<6;i++) printf("\x1b[38;5;%dm■\x1b[0m", n[i]);在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- bat语法配色主题——Solarized、OneDark、Monokai 都基于 256 色调色板
- eza (modern ls)
- deltagit 分页器——语言 token 使用 256 色语法主题
- tig (git TUI)
- vim, neovim (default for 256-colour terminals)
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- 怎样把十六进制颜色映射到最近的 xterm-256 索引?
- 对 6×6×6 RGB 立方体,每个通道用
round(c * 5 / 255)量化到 0–5,索引公式16 + 36*r + 6*g + b。接近灰阶的目标改用灰阶斜坡232 + round(luma * 23 / 255)通常更准。立方体不能均匀覆盖所有十六进制色——近黑近白落到灰阶斜坡上更准。生产库(chalk、colorama、rich)会用基于实际调色板感知距离的查表实现。 - 为什么我的 256 色调色板渐变出现色带?
- 6×6×6 立方体每个通道只有 6 级,所以蓝→青的平滑渐变会被量化到少数几个槽位,无论你生成多少单元——相邻单元落到同一索引。修法二选一:(1)
$COLORTERM=truecolor时改发真彩色(\x1b[38;2;R;G;Bm,每通道 256 级),否则回退到 256 立方体;(2) 提前把渐变步长量化到不同的立方体索引,让每个单元都跳到下一个槽位。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 支持 | 支持 | 支持 | 部分 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |