C1 控制字符 —— ESC 序列的 8 位单字节等价形式(0x80–0x9F)
8 位 C1 控制字节(0x80..0x9F)—— CSI、OSC、ST、DCS、NEL、HTS、IND、RI —— 及其 7 位 ESC <letter> 等价形式。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x9b CSI \x9d OSC \x9c ST \x90 DCS \x85 NEL \x88 HTS \x84 IND \x8d RI\233 / \235 / \234 / \220 / \205 / \210 / \204 / \215(no \e form — these are single 8-bit bytes; use the 7-bit ESC equivalents below)ESC [ ≡ CSI / ESC ] ≡ OSC / ESC \\ ≡ ST / ESC P ≡ DCS / ESC E ≡ NEL / ESC H ≡ HTS / ESC D ≡ IND / ESC M ≡ RI9b / 9d / 9c / 90 / 85 / 88 / 84 / 8d说明
**C1 控制集**占据 `0x80`..`0x9F` 字节范围,为最常用的 `ESC <letter>` 序列提供单字节替代形式。完整集合:`IND`(0x84,ESC D —— 不带 CR 的换行)、`NEL`(0x85,ESC E —— CR+LF)、`HTS`(0x88,ESC H —— 在当前列设置 tab 停位)、`RI`(0x8D,ESC M —— 反向换行,到顶时滚动)、`SS2`(0x8E,ESC N —— 对下一字符使用 G2 字符集单次切换)、`SS3`(0x8F,ESC O —— 单次切换 G3)、`DCS`(0x90,ESC P —— 设备控制串引导符)、`CSI`(0x9B,ESC [ —— 控制序列引导符,最常用)、`ST`(0x9C,ESC \\ —— 用于 DCS / OSC / APC / PM / SOS 的串终止符)、`OSC`(0x9D,ESC ] —— 操作系统命令引导符)、`PM`(0x9E,ESC ^ —— 隐私消息)、`APC`(0x9F,ESC _ —— 应用程序命令,Kitty 图形协议在用)。**现代终端请避免使用 8 位形式**:`0x80..0x9F` 中的每个字节都是 UTF-8 的*续字节*(前导比特模式 `10xxxxxx`),UTF-8 流中出现一个孤立的 `0x9B` 要么被当作非法序列的一部分吸收,要么被静默丢弃。请始终使用 7 位 `ESC <letter>` 形式(`\x1b[`、`\x1b]`、`\x1b\\` 等)—— 在 UTF-8、ASCII、Latin-1 下都是无歧义的,所有终端都识别。8 位 C1 集主要出现在遗留场景中(处于 S8C1T 模式的 DEC VT220、ISO 8859-1 字节流归档、老 VT100 固件测试向量)。
规范出处: ECMA-48 §5.2 (C1 set) / ISO 6429
参数
| IND (0x84, ESC D) | 索引 —— 光标下移 1(无 CR 的 LF);位于区域底部时滚动 |
| NEL (0x85, ESC E) | 下一行 —— CR + LF 合一 |
| HTS (0x88, ESC H) | 水平制表设置 —— 在当前光标列设 tab 停位 |
| RI (0x8D, ESC M) | 反向索引 —— 光标上移 1;位于区域顶部时滚动 |
| SS2 (0x8E, ESC N) | 单次切换 G2 —— 仅对下一字符使用 G2 字符集 |
| SS3 (0x8F, ESC O) | 单次切换 G3 —— 仅对下一字符使用 G3 字符集 |
| DCS (0x90, ESC P) | 设备控制串引导符 —— 由 ST 终止 |
| CSI (0x9B, ESC [) | 控制序列引导符 —— 最常用 |
| ST (0x9C, ESC \\) | 串终止符 —— 关闭 DCS / OSC / APC / PM / SOS |
| OSC (0x9D, ESC ]) | 操作系统命令 —— 由 ST 或 BEL 终止 |
| PM (0x9E, ESC ^) | 隐私消息 —— 由 ST 终止 |
| APC (0x9F, ESC _) | 应用程序命令 —— 由 ST 终止(Kitty 图形协议在用) |
示例
# 7-bit (preferred — UTF-8 safe):\nprintf '\033[31mred\033[0m'\nprintf '\033]0;new window title\033\\\\'\n# 8-bit C1 (legacy — breaks under UTF-8):\nprintf '\x9b31mred\x9b0m' # only works if terminal is in 8-bit mode + Latin-1# Prefer 7-bit ESC form:\nimport sys; sys.stdout.write('\x1b[31mred\x1b[0m')\n# 8-bit C1 — fails on UTF-8 stdouts:\n# sys.stdout.buffer.write(b'\x9b31mred\x9b0m')// 7-bit ESC form (UTF-8 safe):\nfmt.Print("\x1b[31mred\x1b[0m")\n// 8-bit C1 — emits two UTF-8 continuation bytes interpreted as garbage:\n// os.Stdout.Write([]byte{0x9b, '3','1','m'})process.stdout.write('\x1b[31mred\x1b[0m');\n// process.stdout.write(Buffer.from([0x9b, 0x33, 0x31, 0x6d])) // breaks UTF-8/* 7-bit ESC form: */\nprintf("\x1b[31mred\x1b[0m");\n/* 8-bit C1 — only safe on Latin-1 / explicit 8-bit terminals: */\n/* fputc(0x9b, stdout); fputs("31m", stdout); */终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 部分 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 |
相关序列
在家族食谱中
ESC 食谱 · 5. 锁定切换与 8 位 C1 桥 —— `\x1bn` / `\x1bo` / `\x1b|` 与 `\x80-\x9F`