terminal: displaying special characters

Your top example is running with a non-Unicode locale (i.e. ASCII). Check your $LANG environment variable (try export | grep LANG); you will most likely not find a .UTF-8 suffix. Try adding it:

export LANG=$LANG.UTF-8

Your other example is running with a UTF-8 locale, which should be the default for recent shells. It seems htop detects your locale and displays either ASCII or Unicode characters - so in the bottom picture, you get nice Unicode characters, while with ASCII you get some pretty makeshift ones. I'd suggest changing the locale of the top picture's machine to a Unicode one (see Locale - Debian Wiki).

If that doesn't work, it might be that your terminal emulator is the problem. The default encoding could be non-Unicode. Change the default encoding of your terminal emulator to UTF-8 (in xfce4-terminal I found it in the Advanced tab). If you can't, it might be that your current font doesn't support Unicode: try changing your font to a Unicode one.

[Strangely, I found once I'd changed my locale to ASCII once in a shell session, htop always displays the ASCII characters, even after changing it back. That might be your issue, if for some reason you are changing your locale in your shell occasionally.]


The odd thing is that htop uses ncurses, which can draw lines with/without Unicode. However, looking at the source-code in CRT.c shows the explanation:

#ifdef HAVE_LIBNCURSESW
   if(strcmp(nl_langinfo(CODESET), "UTF-8") == 0)
      CRT_utf8 = true;
   else
      CRT_utf8 = false;
#endif

   CRT_treeStr =
#ifdef HAVE_LIBNCURSESW
      CRT_utf8 ? CRT_treeStrUtf8 :
#endif
      CRT_treeStrAscii;

and the CRT_treeStrUtf8 value is

const char *CRT_treeStrUtf8[TREE_STR_COUNT] = {
   "\xe2\x94\x80", // TREE_STR_HORZ ─
   "\xe2\x94\x82", // TREE_STR_VERT │
   "\xe2\x94\x9c", // TREE_STR_RTEE ├
   "\xe2\x94\x94", // TREE_STR_BEND └
   "\xe2\x94\x8c", // TREE_STR_TEND ┌
   "+",            // TREE_STR_OPEN +
   "\xe2\x94\x80", // TREE_STR_SHUT ─
};

However, ncurses (any curses implementation) has portable symbols for these which do not rely upon whether the encoding is UTF-8 or not. Some applications (such as dialog's --ascii-lines option) provide an option for using ASCII line-drawing, but an application that does not even attempt to use the line-drawing provided in ncurses is not making effective use of the library.

In short, when you come across a program that behaves like that, you should report it as a bug to the developers.

Further reading:

  • Line Graphics (ncurses addch manual page)
  • border, wborder, box, hline, whline, vline, wvline, mvhline, mvwhline, mvvline, mvwvline - create curses borders, horizontal and vertical lines
  • dialog screenshots (none require UTF-8 encoding to use line-drawing)