跳到主要内容
ansicode

DECSCL — 选择一致性级别(`CSI Pl ; Pc " p`)

选择 VT100 / VT200 / VT300 / VT400 / VT500 兼容级别 —— 控制终端识别哪个子集的转义序列,并决定 C1 以 7 位还是 8 位发送。隐式先执行硬重置(RIS)。

字节形式

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

\\x1b[\x1b[<Pl>;<Pc>" p
\\033[\033[62;1" p
\\e[\e[62;1" p
ESC [ESC [ Pl ; Pc " p
hex1b 5b ... 22 70

说明

DECSCL —— 一致性级别选择 —— 设置终端将识别的最高 VT 型号转义序列集合,**并**决定 C1 仅以 7 位(`Pc=1`)还是允许 8 位发送(`Pc=0` 或省略)。中间字节为 `"`(0x22),末字节为 `p`(0x70)。 **`Pl` 取值**:`61` = VT100、`62` = VT200 / VT220、`63` = VT300 / VT320、`64` = VT400 / VT420、`65` = VT500 / VT510 / VT520。 **`Pc` 取值**(仅当 `Pl ≥ 62` 时有效):`0` 或省略 = 允许 8 位控制(终端可发出 0x80–0x9F 单字节 C1 —— IND、NEL、HTS、RI、SS2、SS3、DCS、CSI、ST、OSC、PM、APC);`1` = 仅 7 位控制(同样的 C1 改为两字节 `ESC` 等价形式:IND 写作 `ESC D`、NEL 写作 `ESC E`、ST 写作 `ESC \`,详见 `c1-controls`);`2` = 允许 8 位(部分模拟器视作 0 的别名)。 **关键副作用**:DECSCL 在应用新级别前会隐式执行一次**硬重置(等同于 RIS)**。设 `\x1b[62;1" p` 锁定 VT220-7bit 同时会清屏 + 清回滚、重置 SGR、重置边距、恢复自动换行 —— 除非你正想要 RIS 效果,否则**别**在会话中随便调用。 **硬件终端**会把请求级别截断至本机型号 —— 真 VT220 收到 `\x1b[65" p` 仍回到 VT220 级别。**软件模拟器**(xterm、kitty、iTerm2、WezTerm、Ghostty、Alacritty、Konsole、Windows Terminal)一律接受 `61`–`65`,默认按 VT520 工作。多数完全忽略 `Pc` —— 仍默认 7 位发送,仅在 `S8C1T` / `\x1b G` / `\x1b F` 等单独开关启用后才发 8 位。 **查询**:`DCS $ q " p ST`(DECRQSS 查询 DECSCL,见 `dcs-decrqss`)—— 回复 `DCS 1 $ r Pl ; Pc " p ST`。Ghostty 上测得 `\x1bP1$r65;1" p\x1b\\`(VT520 + 7-bit)。常用模式:探测 → 切换 → 退出时恢复。当 TUI 确需切到 VT220 词汇表(如抑制终端对 `?2026` 同步更新括号的解释)时使用 —— 但要预期屏幕内容会消失。 如只想*限制使用某些特性*又不愿付出 RIS 代价,请改用 DECRQM(`decrqm`)逐模式探测,再用 DECRST(`\x1b[?...l`)选择性关闭 —— 这才是大多数人误用 DECSCL 的真实意图。

规范出处: DEC VT510 RM (DECSCL) / xterm-ctlseqs

参数

Pl一致性级别:61 = VT100、62 = VT200/VT220、63 = VT300/VT320、64 = VT400/VT420、65 = VT500/VT510/VT520。硬件终端会截断到本机型号。
Pc控制位(仅 Pl ≥ 62 有效):0 / 2 = 允许 8 位 C1;1 = 仅 7 位(C1 改为两字节 ESC 等价形式)。多数模拟器忽略此参数。

示例

bash
# Lock terminal to VT220 7-bit conformance.\n# WARNING: this also performs an RIS (clears screen + scrollback).\nprintf '\\033[62;1\" p'
python
import sys\n# VT520 with 8-bit C1 allowed (modern default).\nsys.stdout.write('\\x1b[65;0\" p')\nsys.stdout.flush()
go
// VT320 conformance — useful when targeting Sixel-era apps.\nfmt.Print(\"\\x1b[63;0\\\" p\")
javascript
// Most portable target: VT220 7-bit. Survives any modern emulator.\nprocess.stdout.write('\\x1b[62;1\" p')
c
/* DECSCL — implicit RIS first, then apply new level. */\nprintf(\"\\x1b[%d;%d\\\" p\", 62, 1);\nfflush(stdout);

终端支持

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

相关序列