DECRQCRA / DECCKSR —— 请求矩形区域校验和(`CSI Pi;Pg;Pt;Pl;Pb;Pr*y`)
请终端对矩形区域的单元算 16 位校验和(CSI Pi;Pg;Pt;Pl;Pb;Pr*y),DCS DECCKSR 回(\x1bP<Pi>!~<hex4>\x1b\\)。xterm vttest / ConPTY 一致性测试用作金标。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[Pi;Pg;Pt;Pl;Pb;Pr*y reply \x1bP<Pi>!~<hex4>\x1b\\\033[Pi;Pg;Pt;Pl;Pb;Pr*y reply \033P<Pi>!~<hex4>\033\\\e[Pi;Pg;Pt;Pl;Pb;Pr*y reply \eP<Pi>!~<hex4>\e\\ESC [ <Pi> ; <Pg> ; <Pt> ; <Pl> ; <Pb> ; <Pr> * y reply: ESC P <Pi> ! ~ <hex4> ESC \\1b 5b … 2a 79 reply: 1b 50 … 21 7e <hex4> 1b 5c说明
DECRQCRA(*请求矩形区域校验和*,\x1b[<Pi>;<Pg>;<Pt>;<Pl>;<Pb>;<Pr>*y)让终端对边框矩形内每个单元的字符 + 属性算一个 16 位校验和,以 4 位大写十六进制装进 DCS DECCKSR 帧回送:\x1bP<Pi>!~<HHHH>\x1b\\。
这是 xterm vttest 的一致性金标 —— 每个绘屏特性(DECCRA、DECFRA、DECERA、ED、EL、滚屏、行回绕、SGR 笔状态承接、alt-screen 切换)都靠「绘屏 → DECRQCRA → 断言校验和等于记录的金值」来验证。Konsole 的 tests/vt-tests、mlterm 的回归集、PowerShell ConPTY 的 TerminalEcho 测试都依赖它。
参数
- Pi —— 请求 ID(0–65535)。在回复的 !~<Pi> 槽位原样回传,便于流水线发出多请求时解复用。
- Pg —— 页号(1 起算;0 或省略按 1 处理)。现代模拟器几乎不暴露多页内存,故几乎总是 1。
- Pt;Pl;Pb;Pr —— 边框矩形(上、左、下、右;1 起算,含两端)。四项均必需;省略即整页。
校验算法 —— xterm 参考实现:从 0 起,按阅读顺序逐单元减去 cell_char_code + sgr_attr_bits(属性视为带标签的位域:bold = 0x80、underline = 0x40、blink = 0x20、reverse = 0x10 等)。结果对 0x10000 取模即为上报值。算法与 SGR 位映射在不同模拟器间不同 —— 永远不要跨模拟器实现比对校验和;只在「同模拟器同版本对金值」的语境下使用。
回复 —— \x1bP<Pi>!~<HHHH>\x1b\\。!~ 中间-末字节对把 DECCKSR 与其它 DCS 回(DECRQSS 的 $r、DECRPTAB 的 $u、DECRPSS 的 !u)区分开。<HHHH> 是 4 位前补零的大写十六进制。例:全白矩形在新启动的 xterm 上 → \x1bP0!~0000\x1b\\。例:在左上角发 printf '\x1b[31mABC\x1b[0m' 后探测第一格 → \x1bP0!~01A1\x1b\\(xterm 392;值随版本漂移,故金值与版本绑定)。
边界
- 坐标越页 → 静默裁剪(无错误回复)。
- 空矩形(Pt > Pb 或 Pl > Pr)→ 校验和回 0000。
- 部分模拟器(旧版 Konsole、某些 xterm 构建)对校验和取一的补码再上报 —— 只比对自家金值,别比对抽象公式。
- 回复默认以 \x1b\\(ST 表为 ESC + 反斜杠)结束;xterm 在 8 位 C1 模式(decscl-compat-level)下使用单字节 \x9c。
覆盖度 —— xterm = 完整(标准)。mlterm + Konsole + WezTerm = 完整。Ghostty = 部分(有回但校验和值在 SGR 属性变化时与 xterm 差 ≥ 1 位 —— 视为「有回复,算法不同」)。Kitty + iTerm2 = 部分(部分构建回,部分吞)。Alacritty / Linux console / Windows Terminal / cmd / ConPTY / macOS Terminal / gnome-terminal = 无作用(完全不回 —— 探测务必加 ~100 ms 超时)。
规范出处: DEC VT510 RM (DECRQCRA / DECCKSR) / xterm-ctlseqs (CSI Pi;Pg;Pt;Pl;Pb;Pr * y)
参数
| Pi | 请求 ID,0–65535。在回复的 !~<Pi> 槽原样回传,用于流水线解复用。 |
| Pg | 页号,1 起算。现代模拟器仅暴露第 1 页;省略 / 0 → 1。 |
| Pt;Pl;Pb;Pr | 边框矩形(上、左、下、右;1 起算,含两端)。越页坐标静默裁剪。 |
| Reply <hex4> | 4 位前补零大写十六进制。算法与 SGR 位映射各家不同 —— 仅与同模拟器金值比对。 |
示例
# Probe top-left cell on the main screen, parse the DCS reply.\nprintf '\\033[7;1;1;1;1;1*y'\nIFS= read -rs -d '\\\\' -t 0.1 reply </dev/tty 2>/dev/null\necho \"DECCKSR: ${reply}\" # expect: \\x1bP7!~XXXX\\x1bimport sys, re\n# Parse a DECCKSR reply, extract Pi + hex checksum.\nreply = '\\x1bP42!~01A1\\x1b\\\\'\nm = re.search(r'\\x1bP(\\d+)!~([0-9A-F]{4})\\x1b\\\\', reply)\nif m:\n pi, chk = int(m.group(1)), int(m.group(2), 16)\n print(f'request {pi} checksum 0x{chk:04X}')// Pipeline three checksum probes with distinct Pi.\nfor i, rect := range [][4]int{{1,1,1,1},{1,1,1,80},{1,1,24,80}} {\n pi := i + 1\n fmt.Printf(\"\\x1b[%d;1;%d;%d;%d;%d*y\", pi, rect[0], rect[1], rect[2], rect[3])\n}\n// Demux replies by !~<Pi> matching to issued Pi.// vttest-style: paint, checksum, assert against golden.\nasync function checksum(rect) {\n process.stdout.write(`\\x1b[1;1;${rect.t};${rect.l};${rect.b};${rect.r}*y`);\n for await (const buf of process.stdin) {\n const m = /\\x1bP1!~([0-9A-F]{4})\\x1b\\\\/.exec(buf.toString('binary'));\n if (m) return parseInt(m[1], 16);\n }\n}/* Skeleton: emit probe, read until ST, parse Pi + 4 hex digits. */\nprintf(\"\\x1b[1;1;1;1;1;1*y\"); fflush(stdout);\n/* read until 0x1b 0x5c with 100ms select timeout, then sscanf(\"\\x1bP%d!~%4x\\x1b\\\\\", ...). */终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 不支持 | 部分 | 不支持 | 不支持 | 部分 | 不支持 | 支持 | 部分 | 不支持 | 支持 | 支持 | 支持 |