Why don't ANSI symbols work in PuTTY/Debian?

6

The awesome application tree, which I installed in Debian with apt-get install tree, has the option of drawing its output using ANSI graphics. Its output looks like this now:

.
tqq node_modules
x   tqq coffee-script
x   tqq eco
x   tqq express
x   tqq forever
x   mqq stylus
tqq package.json
mqq src
    mqq daemontest.coffee

This is obviously wrong. These are my LANG=en_GB.UTF-8 UTF-8 and LC_ALL=C env variables. PuTTY is set to expect UTF-8 as well. If I change PuTTY to "Use font encoding" then tree -A looks right, however npm list will then break and look like this:

├── coffee-script@1.2.0
├─┬ eco@1.1.0-rc-3
│ └── strscan@1.0.1
├─┬ express@2.5.5
│ ├─┬ connect@1.8.5
│ │ └── formidable@1.0.8
│ ├── mime@1.2.4
│ ├── mkdirp@0.0.7
│ └── qs@0.4.0
...

All of this stuff should work correctly, so I'm guessing my settings are wrong somewhere. Could anyone help me tune in on exactly where?


EDIT: My env now looks like this. Problem is still there

root@chu:~# env
TERM=putty
SHELL=/bin/bash
SSH_CLIENT=**Censored**
SSH_TTY=/dev/pts/1
USER=root
LS_COLORS=rs=**Removed because wall of text**
PYTHONBREW_ROOT=/usr/local/pythonbrew
MAIL=/var/mail/root
PATH=/usr/local/pythonbrew/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/root
LANG=en_GB.UTF-8
SHLVL=1
HOME=/root
LANGUAGE=en_US:en
LS_OPTIONS=--color=auto
PYTHONPATH=:/root/pymodules
LOGNAME=root
SSH_CONNECTION=**Censored**
_=/usr/bin/env

Hubro

Posted 2012-01-13T19:38:45.470

Reputation: 4 846

Answers

9

The first problem is that you have $LC_ALL set to C. If you set $LC_ALL, it will override all other locale settings, including $LANG. Since the "C" locale uses ISO-8859-1, tree will not know about Unicode availability and will attempt to switch to the VT100 graphics codepage (there are four switchable codepages), which PuTTY refuses to do when expecting UTF-8. To fix this, stop setting LC_ALL in your environ and tree will use Unicode graphics.

The second problem is that your $LANG variable is incorrect – you don't need to specify the charset twice. Set LANG=en_GB.UTF-8 to fix this.

The third problem is that you are forcing tree to use VT100 graphics. Do not use the -A option.

Keep PuTTY configured for UTF-8 as well.

(npm is unaffected by this because it is hardcoded to use Unicode graphics regardless of locale.)

user1686

Posted 2012-01-13T19:38:45.470

Reputation: 283 655

Hey thanks for a brilliant answer, but I have a few problems with it. First of all, I've never touched the LC_ALL or LANG variables. I don't know where they're set and I don't know how to unset them or change them. Could you elaborate just a bit on that? Thanks! – Hubro – 2012-01-13T20:34:02.993

@Codemonkey: Check your shell startup scripts first. If you are using bash, then grep LC_ALL ~/.profile ~/.bash_profile ~/.bash_login ~/.bashrc /etc/profile /etc/profile.d/* /etc/*bashrc /etc/environ* /etc/default/locale -- copy/paste that :) – user1686 – 2012-01-13T20:39:13.650

Yeah I found the LC_ALL declaration as well at the LANG one. I removed the LC_ALL and edited LANG. The env output is edited into my question, because tree still just writes "tqq" and "mqq" instead of ANSI graphics – Hubro – 2012-01-13T20:41:34.150

@Codemonkey: 1) Are you running tree or tree -A? Do not use the ANSI mode; just run tree and let it use Unicode instead. 2) Does locale -a show en_GB.UTF-8 in the list? – user1686 – 2012-01-13T20:58:16.067

locale -a: http://pastebin.com/Kzttvgm2. But why can't I use the ANSI characters? npm can use them, why can't tree? – Hubro – 2012-01-14T01:52:08.740

@Codemonkey: You need to generate the locale data, then; in Debian sudo dpkg-reconfigure locales should work, or you can manually uncomment the "en_GB.UTF-8 UTF-8" line in /etc/locale.gen, then run sudo locale-gen. And like I already said: **npm does not use ANSI graphics. It uses their Unicode (UTF-8) equivalents, and only that.** – user1686 – 2012-01-14T03:38:47.490

Note that PuTTY is somewhat unusual in not supporting the ANSI/VT100 graphics in UTF-8 mode. Xterm and others such as Cygwin's mintty do support both at the same time.

– ak2 – 2012-01-14T10:16:22.533

So to summarize, the problem is with tree because it can't display UTF-8 ANSI-looking graphics like npm can? – Hubro – 2012-01-14T18:14:41.650

@Codemonkey: tree can display UTF-8 graphics, but you're telling it not to. 1) Make sure you have your locale settings correct; "locale -a" must have en_GB.utf8 in the list. 2) Set your $LANG to en_GB.UTF-8. (Yes, $LANG must end with UTF-8, not utf8.) 3) Do not run "tree -A"; just "tree" will suffice. – user1686 – 2012-01-14T18:18:10.573

Here is my working setup: http://sprunge.us/VSSc

– user1686 – 2012-01-14T18:25:34.603

Here is my not working setup. Technically all your requirements are being met, but I do have some errors popping up. Notice that tree is using ASCII symbols only, not pretty UTF-8 graphics. Can you see why? – Hubro – 2012-01-14T18:36:27.960

@Codemonkey: The errors are saying that en_GB.UTF-8 does not exist on your system. I already told you how to add it -- either a) run sudo dpkg-reconfigure locales and enable the locale, or b) manually edit /etc/locale.gen, uncomment the required line, then run sudo locale-gen. – user1686 – 2012-01-14T18:49:46.623

Oh god, my bad. I thought I had already done that, but I had the en_US locale installed, not the en_GB. It works now. Thanks a lot for your help – Hubro – 2012-01-14T18:54:04.657