Skip to main content
ansicode

SGR colon sub-parameters — ITU-T T.416 alternative (38:2:: / 48:2:: / 38:5:)

Use `:` (0x3a) instead of `;` (0x3b) between extended-color sub-parameters — the spec-blessed form that disambiguates compound SGR codes from independent ones.

Byte forms

Every common string-literal form so you can paste-and-search either direction.

\\x1b[\x1b[38:2::255:128:64m (T.416) \x1b[38;2;255;128;64m (xterm-legacy)
\\033[\033[38:2::R:G:Bm
\\e[\e[38:2::R:G:Bm
ESC [ESC [ 38 : 2 :: R : G : B m
hex1b 5b 33 38 3a 32 3a 3a ... 6d

Description

**ITU-T Rec. T.416 / ISO/IEC 8613-6** (1993) — the colon-separator form for SGR sub-parameters. Where xterm's original extended-color introduction used semicolons throughout (`\x1b[38;2;R;G;Bm`), the formal standard reserves `:` (0x3a) as the **sub-parameter separator** within a single SGR parameter, and keeps `;` (0x3b) as the **parameter separator** between independent SGR codes. The shapes are: - **24-bit truecolor**: `\x1b[38:2::R:G:Bm` (fg) / `\x1b[48:2::R:G:Bm` (bg). The empty slot after `2` (yielding the `::`) is the optional **colorspace ID** — empty means RGB, but T.416 allows `38:2:Pcs:R:G:B` where Pcs identifies CIE Lab / CIE u'v'L' / etc. Most emulators ignore Pcs and treat the slot as decorative. - **256-color**: `\x1b[38:5:Nm` / `\x1b[48:5:Nm`. Note: only ONE colon between `5` and `N` here — no empty `::` slot, because the 256-color form has no colorspace argument. - **CMY** (`38:3:Pcs:C:M:Y`) and **CMYK** (`38:4:Pcs:C:M:Y:K`) variants exist in T.416 but are essentially never implemented. **Why this matters**: the original xterm form `\x1b[38;2;R;G;Bm` is **ambiguous** to a strictly-conforming SGR parser. Each semicolon-separated token is supposed to be an independent SGR code, so a strict parser sees `38;2;R;G;B` as five independent codes: `38` (set fg to *next item*), `2` (which it might interpret as 'faint'!), then `R G B` as more SGR codes. The colon form `38:2::R:G:B` is unambiguous because the entire compound is a **single parameter** containing sub-tokens — the colons clearly nest under the `38`. The conformance breakdown: - **Honour the colon form**: kitty (since 0.17), foot, WezTerm, alacritty (since 0.10), ghostty, iTerm2, mlterm, konsole 22.04+, xterm 273+, gnome-terminal recent. - **Honour only the semicolon form**: very old emulators, Windows ConPTY (older), some embedded VT clones. - **Honour both**: every modern emulator in the first list — they parse `;` and `:` as equivalent in the truecolor / 256-color slot to avoid breaking existing software. T.416 also defines colon sub-parameters for **SGR 4 underline styles** — `\x1b[4:0m` (none), `\x1b[4:1m` (single, same as `4m`), `\x1b[4:2m` (double), `\x1b[4:3m` (curly / wavy), `\x1b[4:4m` (dotted), `\x1b[4:5m` (dashed) — and the underline colour pair `\x1b[58:2::R:G:Bm` (set underline colour to RGB) / `\x1b[59m` (default underline colour). The wavy underline is the killer feature here — IDE-style 'misspelled word' visuals at the terminal layer. For portable software, the safe pattern is to **emit the semicolon form** (still understood by every emulator) **but parse both forms** when consuming ANSI bytes from an arbitrary log file.

Spec citation: ITU-T Rec. T.416 (ISO/IEC 8613-6) / xterm-ctlseqs (SGR Pm)

Parameters

PcsOptional colorspace ID after the `2` / `3` / `4` mode byte. Empty (yielding `::`) means RGB / CMY / CMYK in the default colorspace. Most emulators ignore.
underline-styleAfter `4:` — `0` none, `1` single, `2` double, `3` curly, `4` dotted, `5` dashed. Curly (3) is the IDE-style wavy underline.

Examples

bash
# Strict T.416 truecolor (note the `::`):\nprintf '\033[38:2::255:128:64morange text\033[0m\n'\n# Curly underline for spell-check overlays:\nprintf '\033[4:3mtypo\033[0m\n'
python
import sys\nRGB = (255, 128, 64)\nsys.stdout.write(f'\x1b[38:2::{RGB[0]}:{RGB[1]}:{RGB[2]}morange\x1b[0m\n')\n# Underline colour (T.416 58 / 59):\nsys.stdout.write('\x1b[4m\x1b[58:2::255:0:0merror\x1b[59m\x1b[24m\n')
go
// Emit semicolon form (most portable) but parse both:\nfmt.Print("\x1b[38;2;255;128;64morange\x1b[0m\n")\n// T.416 strict form:\nfmt.Print("\x1b[38:2::255:128:64morange\x1b[0m\n")
javascript
// Curly underline + RGB underline colour:\nprocess.stdout.write('\x1b[4:3m\x1b[58:2::200:80:80mmisspelled\x1b[59m\x1b[24m\n')
c
/* T.416 256-color: single colon, no empty slot: */\nprintf("\x1b[38:5:208morange-216\x1b[0m\n");\n/* Truecolor with empty colorspace slot: */\nprintf("\x1b[48:2::20:20:60mdeep blue bg\x1b[0m\n");

Terminal support

xterm
yes
Linux console (fbcon)
no
macOS Terminal.app
no
iTerm2
yes
Windows Terminal
partial
cmd.exe / ConPTY
no
kitty
yes
alacritty
yes
WezTerm
yes
Ghostty
yes
GNOME Terminal
yes
Konsole
yes
tmux
no
GNU screen
no

Related sequences

In the family cookbook

SGR cookbook · 6. SGR colon sub-params — the standards-correct form