DECRQUPSS / DECAUPSS —— 请求 / 指派用户首选补充字符集
查询(CSI & u)与指派(DCS Ps ! u … ST)在未触发 Locking Shift 时映射进 GR 槽位的补充字符集 —— 补完 single-locking-shift 留下的「谁占着 GR」一环。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[&u request \x1bP<Ps>!u<D…D>\x1b\\ assign\033[&u request \033P<Ps>!u<D…D>\033\\ assign\e[&u request \eP<Ps>!u<D…D>\e\\ assignESC [ & u / ESC P <Ps> ! u <D…D> ESC \\1b 5b 26 75 / 1b 50 <Ps> 21 75 <body> 1b 5c说明
DECRQUPSS(*请求用户首选补充字符集*,\x1b[&u)与其设值对偶 DECAUPSS(*指派用户首选补充字符集*,\x1bP<Ps>!u<body>\x1b\\)补全 single-locking-shift 故意搁置的另一半 ISO 2022 字符集切换:在任何 Locking Shift 触发之前,GR(右半 0xA0–0xFF)默认指向谁。
为何重要。 在 7 位通道(Telnet、串口卡、NRCS 终端)上,GL 半段一旦让给 ASCII,GR 就是非 ASCII 字形的唯一去处。ISO 2022 把这位常驻 GR 的字符集称为*用户首选补充字符集* —— DEC 默认是 DEC Supplemental Graphic(历史上的重音 / 制表 / 数学集),但 ECMA-43 / DEC VT510 允许把 ISO Latin-1(或任何注册过的 96 字符集)装进去。DECAUPSS 让主机说「从现在起,GR 是 Latin-1」;DECRQUPSS 让主机问「GR 现在解析到哪?」。
请求形态 —— DECRQUPSS:\x1b[&u。无参数;& 中间字节 + u 末字节是唯一形态。
回复形态 —— 终端以 DECAUPSS 形帧回填当前 UPSS:\x1bP<Ps>!u<DesignatorBytes>\x1b\\。Ps = 0 表 94 字符集(G0 风格指示符),Ps = 1 表 96 字符集(Latin 风格指示符)。<DesignatorBytes> 是 ISO-2022 末字节,命名具体集合:
- %5 → DEC Supplemental Graphic(DEC 默认,回 \x1bP0!u%5\x1b\\)
- A → ISO Latin-1 Supplemental(\x1bP1!uA\x1b\\ —— 96 集,故 Ps=1)
- < → DEC Technical Set
- = → DEC Hebrew Supplemental、"4 → DEC Hebrew-7、"? → DEC Greek、%2 → Turkish、R → French、K → German(NRCS 家族)
设值侧 —— DECAUPSS 用相同主体。把 Latin-1 装进 GR:\x1bP1!uA\x1b\\。恢复 DEC 默认:\x1bP0!u%5\x1b\\。生效是全局的,直至下一次 DECAUPSS、DECSTR 软重置(回到 DEC 默认)或 RIS 硬重置。
与移位家族的关系。 指示符(\x1b ( / ) / * / +)把具体集合加载到 G0/G1/G2/G3 寄存器。Locking Shifts(LS0 / LS1 / LS1R / …)与 Single Shifts(SS2 / SS3)*调用*这些寄存器到 GL / GR。UPSS 是回退路径 —— 当未激活任何对 GR 的 Locking Shift 时,GR 解析到 UPSS,而不是 G1。这就解释了为何 \x1b(0(DEC 特殊图形 → G0)+ 一字节 GL 产生制表线,但一个*高位*字节(0xA0+)在没有 LS1R 时仍击中 UPSS 当前的集合(默认 DEC Supplemental,若被改派则 Latin-1)。
覆盖度 —— 小众。真 xterm + mlterm + gnome-terminal + Konsole = 完整(terminfo 的 acsc/smacs/rmacs 仍经此路径,故 ISO 2022 在其中仍活)。WezTerm + iTerm2 = 部分(解析并确认请求但视主体为空操作 —— 默认就是 Latin-1,因为 UTF-8 已覆盖了 UPSS 的全部用途)。Kitty / Alacritty / Ghostty / Windows Terminal / cmd / ConPTY / macOS Terminal / Linux console = 无作用(两向均静默忽略 —— UTF-8 已废止该用例)。2026 年,仅当接收端是已知 ISO-2022-aware 模拟器时再发 DECAUPSS;其余场景直接用 UTF-8 编码文本。
规范出处: DEC VT510 RM (DECRQUPSS / DECAUPSS) / ISO 2022 §6.4 (UPSS) / ECMA-35 §13.4
参数
| Ps = 0 (94-set) | 指示符是 94 字符集(多数 DEC 集 —— DEC Supplemental %5、DEC Technical <、NRCS R/K/=) |
| Ps = 1 (96-set) | 指示符是 96 字符集(Latin-1 A、Latin-2 B、Latin-Cyrillic L、Latin-Greek F、Latin-Hebrew H) |
| %5 | DEC 补充图形(UPSS 的 DEC 默认) |
| A | ISO Latin-1 补充(脱离 DEC 模式后的现代默认) |
| < | DEC 技术字符集(技术排版的数学 / 希腊字形) |
示例
# Probe UPSS, parse the DCS reply (timeout-protected).\nprintf '\\033[&u'\nIFS= read -rs -d '\\\\' -t 0.1 reply </dev/tty 2>/dev/null\necho \"UPSS reply: ${reply}\" # xterm: \\x1bP1!uA\\x1b (Latin-1 today on most builds)\n# Re-assign UPSS to DEC Supplemental Graphic (DEC default):\nprintf '\\033P0!u%%5\\033\\\\'import sys, re, tty, termios, select\n# Switch GR to ISO Latin-1, then back to DEC Supplemental.\nsys.stdout.write('\\x1bP1!uA\\x1b\\\\') # GR = Latin-1\nsys.stdout.flush()\n# ... do work that emits 0xA0–0xFF bytes ...\nsys.stdout.write('\\x1bP0!u%5\\x1b\\\\') # restore DEC default\nsys.stdout.flush()// Parse a DECRQUPSS reply: extract Ps + designator.\nimport (\n \"fmt\"\n \"regexp\"\n)\nvar upssRe = regexp.MustCompile(\"\\x1bP([01])!u([^\\x1b]+)\\x1b\\\\\\\\\")\nfunc parseUPSS(buf string) (ps int, designator string, ok bool) {\n m := upssRe.FindStringSubmatch(buf)\n if m == nil { return 0, \"\", false }\n fmt.Sscanf(m[1], \"%d\", &ps)\n return ps, m[2], true\n}// Reassign UPSS to Latin-1 (modern default) and confirm.\nprocess.stdout.write('\\x1bP1!uA\\x1b\\\\');\n// Query: emit DECRQUPSS and parse the reply.\nprocess.stdout.write('\\x1b[&u');\nprocess.stdin.once('data', (buf) => {\n const m = /\\x1bP([01])!u([^\\x1b]+)\\x1b\\\\/.exec(buf.toString('binary'));\n console.error('UPSS Ps=' + (m?.[1] ?? '?') + ' set=' + (m?.[2] ?? '?'));\n});/* Set UPSS to Latin-1, then probe. */\nfputs(\"\\x1bP1!uA\\x1b\\\\\", stdout);\nfputs(\"\\x1b[&u\", stdout); fflush(stdout);\n/* Read until ST (0x1b 0x5c) with 100ms select timeout, then parse !u<designator>. */终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 不支持 | 部分 | 不支持 | 不支持 | 不支持 | 不支持 | 部分 | 不支持 | 支持 | 支持 | 支持 | 支持 |
相关序列
在家族食谱中
DCS 食谱 · 3. 向终端提问 —— DECRQSS、terminfo cap、DECRQTSR、DECRQUPSS、光标样式