I have to draw a box in C, using ncurses;
First, I have defined some values for simplicity:
#define RB "\e(0\x6a\e(B" (ASCII 188,Right bottom, for example)
I have compiled with gcc, over Ubuntu, with -finput-charset=UTF-8
flag.
But, if I try to print with addstr or printw, I get the hexa code. What I`m doing wrong?
ncurses
defines the valuesACS_HLINE
,ACS_VLINE
,ACS_ULCORNER
,ACS_URCORNER
,ACS_LLCORNER
andACS_LRCORNER
. You can use those constants inaddch
and friends, which should result in your seeing the expected box characters. (There's lots more ACS characters; you'll find a complete list inman addch
.)ncurses
needs to know what it is drawing because it needs to know exactly where the cursor is all the time. Outputting console control sequences is not a good idea; if ncurses knows how to handle the sequence, it has its own abstraction for the feature and you should use that abstraction. The ACS ("alternate character set") defines are one of those abstractions.A few issues:
"\e(0\x6a\e(B"
using addstr, then ncurses (any curses implementation) will translate the individual characters to printable form as described in the addch manual page.ACS_HLINE
) which are predefined characters with theA_ALTCHARSET
attribute combined. You can read about those in the Line Graphics section of theaddch
manual page.0x6a
is ASCIIj
, which (given a VT100-style mapping) would be the lower left corner. The curses symbol for that isACS_LRCORNER
.addstr
; insteadaddch
,addchstr
are useful. There are also functions oriented to line-drawing (seebox
and friends).running in Ubuntu, your locale encoding is probably UTF-8. To make your program work properly, it should initialize the locale as described in the Initialization section of the ncurses manual page. In particular:
setlocale(LC_ALL, "");
Also, your program should link against the ncursesw library (
-lncursesw
) to use UTF-8, rather than just ncurses (-lncurses
)._GNU_SOURCE
.