I'm trying to change encoding in the urxvt current session by changing LANG variable. Howerever, it seems like it doesn't apply immediately. Here is what I do:
Available locales:
$ locale -a
C
en_US.utf8
POSIX
ru_RU.koi8r
ru_RU.utf8
Before setting new locale:
$ echo "а" | od -t x1
0000000 d0 b0 0a # good! UTF-8
# | a ||NL|
After:
$ export LANG=ru_RU.KOI8-R
$ echo "а" | od -t x1
0000000 d0 b0 0a # hm..expect 'c1 0a'
Fork new urxvt instance by running $ urxvt & and finally get what I want:
$ echo "а" | od -t x1
0000000 c1 0a
Why doesn't LANG change the behavior in the first place?
There are two factors:
LANGis not the first environment variable checked. According tolocale(7),LC_ALLandLC_CTYPEwould be checked first:If the second argument to setlocale(3) is an empty string, "", for the default locale, it is determined using the following steps: 1. If there is a non-null environment variable LC_ALL, the value of LC_ALL is used. 2. If an environment variable with the same name as one of the categories above exists and is non-null, its value is used for that category. 3. If there is a non-null environment variable LANG, the value of LANG is used.For the latter, look at the output from the
localecommand, which lists all of the environment variables which would be used:Just changing
LANGshould not change the other variables, but changingLC_ALLgenerally does that.