DECRQUPSS / DECAUPSS — Request / Assign User-Preferred Supplemental Set
Query (`CSI & u`) and assign (`DCS Ps ! u … ST`) the supplemental character set the terminal maps into the GR slot when no Locking Shift is active. Closes the supplemental-set plumbing left after `single-locking-shift`.
Byte forms
Every common string-literal form so you can paste-and-search either direction.
\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 5cDescription
**DECRQUPSS** (*Request User-Preferred Supplemental Set*, `\x1b[&u`) and its setter **DECAUPSS** (*Assign User-Preferred Supplemental Set*, `\x1bP<Ps>!u<body>\x1b\\`) cover the half of ISO 2022 character-set switching that `single-locking-shift` deliberately punted on: **who is the GR (right-half, 0xA0–0xFF) charset by default**, before any Locking Shift fires. **Why this matters.** On a 7-bit channel (Telnet, serial cards, NRCS terminals) the GR half is the only place left for non-ASCII glyphs once the GL half holds ASCII. ISO 2022 calls the resident occupant of GR the *user-preferred supplemental set* — by DEC default it is **DEC Supplemental Graphic** (the historical accent / box-drawing / math set), but ECMA-43 / DEC VT510 allow assigning **ISO Latin-1** (or any registered 96-char set) into the slot instead. DECAUPSS lets the host say 'from now on, GR is Latin-1'; DECRQUPSS lets the host ask 'what does GR resolve to right now?'. **Request shape** — DECRQUPSS: `\x1b[&u`. No parameters; the `&` intermediate + `u` final is the only form. **Reply shape** — terminal echoes its current UPSS via DECAUPSS-shaped frame: `\x1bP<Ps>!u<DesignatorBytes>\x1b\\`. `Ps` = `0` for a 94-character set (G0-style designator), `Ps` = `1` for a 96-character set (Latin-style designator). `<DesignatorBytes>` is the ISO-2022 final-byte that names the set: - `%5` → DEC Supplemental Graphic (the DEC default, returns `\x1bP0!u%5\x1b\\`) - `A` → ISO Latin-1 Supplemental (`\x1bP1!uA\x1b\\` — 96-set, so `Ps=1`) - `<` → DEC Technical Set - `=` → DEC Hebrew Supplemental, `"4` → DEC Hebrew-7, `"?` → DEC Greek, `%2` → Turkish, `R` → French, `K` → German (the NRCS family) **Set side** — DECAUPSS uses the identical body. To put Latin-1 into GR: `\x1bP1!uA\x1b\\`. To restore DEC default: `\x1bP0!u%5\x1b\\`. Effect is global until next DECAUPSS, DECSTR soft reset (which restores DEC default), or RIS hard reset. **Relationship to the shift family.** Designators (`\x1b ( ` / `)` / `*` / `+`) load specific sets into the G0/G1/G2/G3 registers. Locking Shifts (LS0 / LS1 / LS1R / …) and Single Shifts (SS2 / SS3) *invoke* those registers into GL / GR. **UPSS is the fallback** — when no Locking Shift to GR is active, GR resolves to the UPSS, not to G1. This explains why `\x1b(0` (DEC Special Graphics → G0) + a GL byte produces line-drawing characters but a *high-bit* byte (0xA0+) without LS1R still hits whatever UPSS is set to (DEC Supplemental by default, Latin-1 if reassigned). **Coverage** — niche. Real **xterm** + **mlterm** + **gnome-terminal** + **Konsole** = full (the ISO 2022 path is still alive there because terminfo's `acsc`/`smacs`/`rmacs` route through it). **WezTerm** + **iTerm2** = partial (parse + acknowledge the request but treat the body as no-op; their default is Latin-1 because UTF-8 already covers what UPSS was for). **Kitty** / **Alacritty** / **Ghostty** / **Windows Terminal** / **cmd / ConPTY** / **macOS Terminal** / **Linux console** = no-op (silently ignore both directions — UTF-8 obsoleted the use case). In 2026, send DECAUPSS only if the receiver is a known ISO-2022-aware emulator; otherwise use UTF-8 encoded text directly.
Spec citation: DEC VT510 RM (DECRQUPSS / DECAUPSS) / ISO 2022 §6.4 (UPSS) / ECMA-35 §13.4
Parameters
| Ps = 0 (94-set) | designator is a 94-character set (most DEC sets — DEC Supplemental %5, DEC Technical <, NRCS R/K/=) |
| Ps = 1 (96-set) | designator is a 96-character set (Latin-1 A, Latin-2 B, Latin-Cyrillic L, Latin-Greek F, Latin-Hebrew H) |
| %5 | DEC Supplemental Graphic (DEC default for UPSS) |
| A | ISO Latin-1 Supplemental (the modern default when leaving DEC mode) |
| < | DEC Technical Character Set (math / Greek glyphs for technical typesetting) |
Examples
# 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>. */Terminal support
- xterm
- yes
- Linux console (fbcon)
- no
- macOS Terminal.app
- no
- iTerm2
- partial
- Windows Terminal
- no
- cmd.exe / ConPTY
- no
- kitty
- no
- alacritty
- no
- WezTerm
- partial
- Ghostty
- no
- GNOME Terminal
- yes
- Konsole
- yes
- tmux
- no
- GNU screen
- no
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| yes | no | no | partial | no | no | no | no | partial | no | yes | yes | no | no |