web-dev-qa-db-fra.com

Comment définir les paramètres régionaux dans la session de terminal actuelle?

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?

8

Il y a deux facteurs:

  • vous utilisez peut-être un shell avec un écho intégré (et vous n'avez pas informé le shell que vous modifiez les paramètres régionaux)
  • 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
10
Thomas Dickey