The Mysterious ^[[ Characters

Blog - Programming

User Rating: / 1
PoorBest 

Oct 11, 2005  By Pradeep Padala

Have you ever redirected the output of a curses program with colors and wondered what those mysterious ^[[ symbols are? Have you ever tried to produce colors with a printf command without using curses? If the answer to either of these questions is yes, read on. This article attempts to explain the mysterious characters that one finds in the output of a curses program that produces colors. Later, we extend this concept to produce colors with a mere printf command.

Terminal Codes

In the old days of teletype terminals, terminals were located far away from computers and were connected to them through serial cables. The terminals could be configured by sending a series of bytes to each one. All of the capabilities of terminals could be accessed through these series of bytes, which usually are called escape sequences because they start with an escape (0x1B) character. Even today, with vt100 emulation, we can send escape sequences to the emulator that have the same effect on the terminal window. Hence, in order to print color, we merely echo a control code.

To start, type this on your console:

echo "^[[0;31;40mIn Color"

The first character is an escape character, which looks like two characters, ^ and [. To be able to print this, you have to press CTRL+V and then the ESC key. All the other characters are normal printable characters, so you see the string In Color in red. The type stays that color until you revery back by typing this:

echo "^[[0;37;40m"

As you can see, it is easy to set and reset colors in a console or xterm. A myriad of escape sequences are available with which you can do a lot of things, including moving the cursor and resetting the terminal.

The Color Code: <ESC>[{attr};{fg};{bg}m

Now, I explain the escape sequence used to produce colors. The sequence to be printed or echoed to the terminal is

	<ESC>[{attr};{fg};{bg}m

The first character is ESC, which has to be entered by pressing CTRL+V and then ESC on the Linux console or in xterm, konsole, kvt and so on. Incidentally, CTRL+V ESC also is the combination used to embed an Esc character in a document in Vim. Then, {attr}, {fg} and {bg} have to be replaced with the correct value to achieve the corresponding effect. attr is the attribute, such as blinking or underlined text, while fg and bg are foreground and background colors, respectively. You don't have to put braces around the number; simply writing the number is sufficient.

{attr} needs to be one of the following:

  • 0 Reset All Attributes (return to normal mode)

  • 1 Bright (usually turns on BOLD)

  • 2 Dim

  • 3 Underline

  • 5 Blink

  • 7 Reverse

  • 8 Hidden

{fg} needs to be one of the following:

  • 30 Black

  • 31 Red

  • 32 Green

  • 33 Yellow

  • 34 Blue

  • 35 Magenta

  • 36 Cyan

  • 37 White

{bg} needs to be one of the following:

  • 40 Black

  • 41 Red

  • 42 Green

  • 43 Yellow

  • 44 Blue

  • 45 Magenta

  • 46 Cyan

  • 47 White

So, to get a blinking line with a blue foreground and a green background, the combination should be:

	
echo "^[[5;34;42mIn color"

which actually is very ugly. So, revert back with

echo "^[0;37;40m"

With printf()

What if you want to use this code color and attribute functionality in a C program? Well, that's simple. Before you printf something, print the escape sequence to produce it in the desired color. I have written a small routine, textcolor(), that does this automatically for you. You can use it in your C programs, along with the #define constants.

      |textcolor()|

#include <stdio.h>

#define RESET		0
#define BRIGHT 		1
#define DIM		2
#define UNDERLINE 	3
#define BLINK		4
#define REVERSE		7
#define HIDDEN		8

#define BLACK 		0
#define RED		1
#define GREEN		2
#define YELLOW		3
#define BLUE		4
#define MAGENTA		5
#define CYAN		6
#define	WHITE		7

void textcolor(int attr, int fg, int bg);
int main()
{	textcolor(BRIGHT, RED, BLACK);	
	printf("In color\n");
	textcolor(RESET, WHITE, BLACK);	
	return 0;
}

void textcolor(int attr, int fg, int bg)
{	char command[13];

	/* Command is the control command to the terminal */
	sprintf(command, "%c[%d;%d;%dm", 0x1B, attr, fg + 30, bg + 40);
	printf("%s", command);
}

The textcolor() program is modeled against the Turbo C API function. You call the function to set the color and then print it with sprintf(), a function used in Turbo C to produce console output in color.

 

 



Add this page to your favorite Social Bookmarking websites

Add comment


Security code
Refresh

Idioms

  • Like father, like son (Hổ phụ sanh hổ tử)
  • What must be , must be. (Cái gì đến sẽ đến)

Who's online

We have 14 guests online

Location

 38.107.179.217
 38.107.179.217
Search Bot
 unknown unkno

Relax

Site Ranking


Increase your website traffic with Attracta.com

Quick Search

This Day in History

Poll

What is your current operating system?
 

Weather

Newsletter

Copyright © 2012 Thong D. Nguyen. All Rights Reserved.
Joomla! is Free Software released under the GNU/GPL License.