跳到主要内容
ansicode

SGR 73 / 74 / 75 —— 上标 / 下标 / 取消

Mintty 的上标 / 下标 SGR 对,现已被 Kitty 0.32+、WezTerm、foot 与 iTerm2 实现。是终端输出能不靠特殊字符排出数学、脚注与化学式的第一组 SGR。

字节形式

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

\\x1b[\x1b[73m superscript \x1b[74m subscript \x1b[75m neither
\\033[\033[73m / \033[74m / \033[75m
\\e[\e[73m / \e[74m / \e[75m
ESC [ESC [ 73 m / ESC [ 74 m / ESC [ 75 m
hex1b 5b 37 33 6d / 1b 5b 37 34 6d / 1b 5b 37 35 6d

说明

三个超出历史 ECMA-48 词汇(止于 SGR 65)的 SGR 码,由 **mintty** 在 2017 年前后引入,**Kitty 0.32+**、**WezTerm 20240128+**、**foot 1.16+**、**iTerm2 3.5+** 后续跟进。它们是 Unicode 上标 / 下标块(U+2070–U+209F)的*属性*对偶 —— 不替换字模,而让终端把*当前*字模以更小尺寸、抬升 / 下沉的基线渲染。 **编码** - `\x1b[73m` —— **上标**。后续字符以约 75% 尺寸、基线大致抬至 cap-height 行渲染。 - `\x1b[74m` —— **下标**。后续字符以约 75% 尺寸、基线下沉渲染。 - `\x1b[75m` —— **取消**。同时关闭上下标。与 `\x1b[0m`(同时清掉所有其他属性)不同。 **为何要紧** - *数学输出* —— `H₂O` 写作 `H\x1b[74m2\x1b[75mO`,而不是 `H\u2082O`(后者只在输出字体含下标码点时奏效,许多等宽字体没有)。 - *脚注* —— `text¹` 用 `text\x1b[73m1\x1b[75m` 渲染,且作为普通数字仍可搜索 / 复制粘贴。 - *化学 / 单位* —— `m²`、`m³`、`kg·m·s⁻¹` 都能在等宽下渲染而无需字形替换。 - *Diff 输出* —— `git --color-words` 等工具可用上下标标记插入 / 删除位置,不扰动源行。 **约束** - 属性按规范**互斥**:在下标激活时发 `\x1b[73m` 应切换到上标而非堆叠。实际模拟器实现正确(最后一个赢)。 - **不可嵌套** —— 没有「上上标」的 SGR。终端回落为单层渲染。 - **复制 / 粘贴保留写入的码点**,不是渲染后的字模 —— 因此 `H\x1b[74m2\x1b[75mO` 往返回到 `H2O`(剪贴板会剥掉转义)。这是平文本往返的正确行为,但意味着不能依赖视觉上的上下标向不识别 SGR 的下游工具传达语义上下标 —— 用 Unicode 做那件事。 - **宽度** —— 上下标字符仍占网格 1 列宽;更小的字模不改列对齐。这对 TUI 布局很要紧:`10²` 这种标注仍是 3 单元宽。 **覆盖度**:**Kitty**(≥ 0.32)+ **WezTerm**(≥ 20240128)+ **foot**(≥ 1.16)+ **iTerm2**(≥ 3.5)+ **mintty**(≥ 3.4)= 完整。**Ghostty** = 完整(自 1.0 起)。**xterm** = 部分(`patch #383+`,仅在 `cjkWidth: true` 时;否则关闭)。**gnome-terminal** + **Konsole** + **Alacritty** + **Windows Terminal** + **cmd / ConPTY** + **macOS Terminal** + **Linux console** = 静默吞掉(SGR 被解析,但渲染器仍以正常尺寸基线绘制)。Reset(`\x1b[0m`)在任何地方都关闭这两个属性。

规范出处: mintty / Kitty terminal-graphics-protocol superscript-extension / xterm-ctlseqs patch #383

参数

73上标开。
74下标开。
75取消上下标(不动其他 SGR 属性)。

示例

bash
# Write 'H2O' with the 2 as subscript.\nprintf 'H\\033[74m2\\033[75mO\\n'\n# Cite 'foo^1' with footnote marker.\nprintf 'see foo\\033[73m1\\033[75m for context.\\n'
python
import sys\nsys.stdout.write('Area: 10\\x1b[73m2\\x1b[75m m\\x1b[73m2\\x1b[75m\\n')   # 10² m²
go
// Render a sequence: x¹, x², x³ in monospace via SGR rather than Unicode.\nfor _, n := range []int{1, 2, 3} {\n    fmt.Printf(\"x\\x1b[73m%d\\x1b[75m \", n)\n}\nfmt.Println()
javascript
// Footnote marker that copy-pastes as plain digit.\nprocess.stdout.write('see ref' + '\\x1b[73m' + idx + '\\x1b[75m\\n');
c
/* Chemical formula with subscripts. */\nprintf(\"C\\x1b[74m6\\x1b[75mH\\x1b[74m12\\x1b[75mO\\x1b[74m6\\x1b[75m\\n\");

终端支持

xterm
部分
Linux console (fbcon)
不支持
macOS Terminal.app
不支持
iTerm2
支持
Windows Terminal
不支持
cmd.exe / ConPTY
不支持
kitty
支持
alacritty
不支持
WezTerm
支持
Ghostty
支持
GNOME Terminal
不支持
Konsole
不支持
tmux
不支持
GNU screen
不支持

相关序列