跳到主要内容
ansicode

SGR 38;5;n — 256 色前景

从 xterm 256 色调色板中选择前景色。

字节形式

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

\\x1b[\x1b[38;5;Nm
\\033[\033[38;5;Nm
\\e[\e[38;5;Nm
ESC [ESC [ 3 8 ; 5 ; N m
hex1b 5b 33 38 3b 35 3b <N> 6d

实时预览

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

red orange yellow green cyan magenta

说明

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 把 3848 保留为「未来使用」,让实现自选子参数语法)。大多数解析器同时接受分号形 \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)

示例

bash
for n in 16 51 196 226 51 21 201; do printf "\033[38;5;${n}m■\033[0m"; done; echo
python
for n in [16, 196, 226, 21, 51, 201]: print(f'\x1b[38;5;{n}m■\x1b[0m', end='')
go
for _, n := range []int{16,196,226,21,51,201} { fmt.Printf("\x1b[38;5;%dm■\x1b[0m", n) }
javascript
[16,196,226,21,51,201].forEach(n => process.stdout.write(`\x1b[38;5;${n}m■\x1b[0m`))
c
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) 通常更准。立方体不能均匀覆盖所有十六进制色——近黑近白落到灰阶斜坡上更准。生产库(chalkcoloramarich)会用基于实际调色板感知距离的查表实现。
为什么我的 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
支持

相关序列

在家族食谱中

SGR 食谱 · 3. 256 索引色 —— `\x1b[38;5;n m`