This is normal. It happens simply because the Linux kernel console does not support the 256-color mode. It wasn't written to use 256 colors, as in VGA text mode there's simply no way to do that. (In framebuffer mode it could, but the code still has the exact same constraints.) GNU Screen knows this and automatically translates from the 256-color palette to the nearest 16-color one.
Only very recent Linux versions (3.13 and later) started recognizing the 256-color escape codes, but even then it still maps them to the 16-color palette just like Screen would.
There are framebuffer-based terminal emulators like kmscon or fbterm which implement their own rendering, and draw everything via KMS. Use those if you want a capable terminal avoiding X11.
Blinking text happens because the 256-color codes are very easily confused the 16-color ones. For example, ESC [38;5;35m
can be interpreted as the 256-color code, or three ANSI (16-color) codes.
The Linux console doesn't know what
38
means, so it just interprets5
as "enable blink" and35
as "foreground – color #5 (magenta)" in the usual way.
(See for example this table, under "SGR".)Meanwhile, your X11 terminals recognize the
38
as the magic "foreground – extra colors" code, so they interpret5
as "use 256-color palette" and35
as "use color #35 (cyan)".
(There's a 24-bit RGB mode too, asESC [38;2;<r>;<g>;<b>m
.)