J'essaie de changer l'encodage dans la session actuelle urxvt en changeant la variable LANG
. Cependant, il semble que cela ne s'applique pas immédiatement. Voici ce que je fais:
Paramètres régionaux disponibles:
$ locale -a
C
en_US.utf8
POSIX
ru_RU.koi8r
ru_RU.utf8
Avant de définir de nouveaux paramètres régionaux:
$ echo "а" | od -t x1
0000000 d0 b0 0a # good! UTF-8
# | a ||NL|
Après:
$ export LANG=ru_RU.KOI8-R
$ echo "а" | od -t x1
0000000 d0 b0 0a # hm..expect 'c1 0a'
Créez une nouvelle instance urxvt en exécutant $ urxvt &
et enfin obtenir ce que je veux:
$ echo "а" | od -t x1
0000000 c1 0a
Pourquoi LANG
ne change-t-il pas le comportement en premier lieu?
Il y a deux facteurs:
LANG
n'est pas la première variable d'environnement vérifiée. Selon locale(7)
, LC_ALL
et LC_CTYPE
serait vérifié en premier:Si le deuxième argument de setlocale (3) est une chaîne vide, "", pour L'environnement local par défaut, il est déterminé en utilisant les étapes suivantes: 1. S'il existe une variable d'environnement non nulle LC_ALL, la valeur De LC_ALL est utilisée. 2. Si une variable d'environnement portant le même nom que l'un des les catégories ci-dessus existent et sont non nulles, sa valeur est utilisée pour cette catégorie. 3. S'il existe une variable d'environnement non nulle LANG, le la valeur de LANG est utilisée.
Pour ce dernier, regardez la sortie de la commande locale
, qui répertorie toutes les variables d'environnement qui seraient utilisées:
$ export LANG=ru_RU.KOI8-R
$ locale
LANG=ru_RU.KOI8-R
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
Changer simplement LANG
ne devrait pas changer les autres variables, mais changer LC_ALL
fait généralement cela.
$ export LC_ALL=ru_RU.KOI8-R
$ locale
LANG=ru_RU.KOI8-R
LANGUAGE=
LC_CTYPE="ru_RU.KOI8-R"
LC_NUMERIC="ru_RU.KOI8-R"
LC_TIME="ru_RU.KOI8-R"
LC_COLLATE="ru_RU.KOI8-R"
LC_MONETARY="ru_RU.KOI8-R"
LC_MESSAGES="ru_RU.KOI8-R"
LC_PAPER="ru_RU.KOI8-R"
LC_NAME="ru_RU.KOI8-R"
LC_ADDRESS="ru_RU.KOI8-R"
LC_TELEPHONE="ru_RU.KOI8-R"
LC_MEASUREMENT="ru_RU.KOI8-R"
LC_IDENTIFICATION="ru_RU.KOI8-R"
LC_ALL=ru_RU.KOI8-R