An explanation of common terminal emulator color codes
This is based on a post on reddit, published on 2013-03-21.
So all terminals support the same 256 colors? What about 88 color mode: is that a subset?
TL;DR: yes
Terminal compatibility is crazy complex, because nobody actually reads the spec, they just write something that is compatible for their tests. Then things have to be compatible with that terminal’s quirks.
But, here’s how 8-color, 16-color, and 256 color work. IIRC, 88 color is a subset of the 256 color scheme, but I’m not sure.
8 colors: (actually 9) First we had 8 colors (9 with “default”, which doesn’t have to be one of the 8). These are always roughly the same color: black, red, green, yellow/orange, blue, purple, cyan, and white, which are colors 0–7 respectively. Color 9 is default.
16 colors: (actually 18) Later, someone wanted to add more colors, so they added a “bright” attribute. So when bright is on, you get “bright red” instead of “red”. Hence 8*2=16 (plus two more for “default” and “bright default”).
256 colors: (actually 274) You may have noticed, colors 0–7 and 9 are used, but 8 isn’t. So, someone decided that color 8 should put the terminal into 256 color mode. In this mode, it reads another byte, which is an 8-bit RGB value (2 bits for red, 2 for green, 2 for blue). The bright property has no effect on these colors. However, a terminal can display 256-color-mode colors and 16-color-mode colors at the same time, so you actually get 256+18 colors.