2017-05-13 3 views
2

Je suis en train de changer le codage dans la urxvt session en cours en changeant la variable LANG. Cependant, il semble que cela ne s'applique pas immédiatement. Voici ce que je fais:Comment définir les paramètres régionaux dans la session du terminal en cours?

locales disponibles:

$ locale -a 
C 
en_US.utf8 
POSIX 
ru_RU.koi8r 
ru_RU.utf8 

Avant de nouvelle locale:

$ 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' 

nouvelle instance de urxvt Fork en exécutant $ urxvt & et enfin ce que je veux:

$ echo "а" | od -t x1 
0000000 c1 0a 

Pourquoi ne pas LANG changer le comportement en premier lieu?

+0

Publié une réponse applicable pour un shell 'bash', quel shell de connexion utilise' urxvt'? – Inian

+0

Quels fichiers de démarrage sont lus par 'urxvt', ajoutez la ligne en y changeant les paramètres régionaux. Il devrait le refléter pour toutes vos sessions ultérieures. – Inian

+0

Probablement, il utilise bash. 'ajoutez la ligne en changeant les paramètres régionaux' - le problème n'est pas de changer la locale, mais de la changer dans la session CURRENT. Je sais que je peux mettre cette ligne à .bash_profile ou .bashrc - mais ce n'est pas ce que je veux. –

Répondre

3

Il y a deux facteurs:

  • vous pouvez utiliser une coque avec un écho intégré (et n'ont pas informé le shell que vous modifiez les paramètres régionaux)
  • LANG ne sont pas les première variable d'environnement vérifiée. Selon locale(7), LC_ALL et LC_CTYPE serait cochés:
 
     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. 

Pour ce dernier, regardez la sortie de la commande locale, qui répertorie toutes les variables d'environnement qui seraient utilisés:

$ 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 LANG Tout ne devrait pas ch ANGE les autres variables, mais en changeant LC_ALL fait généralement que.

$ 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 
+0

'(et n'ont pas informé le shell que vous changez les paramètres régionaux)' - si oui, comment le faire? La sortie de 'cat' est la même. BTW, j'ai essayé vos suggestions pour 'LC_ALL' - ne fonctionne toujours pas (si être plus explicite pour l'encodage stdin). –

+0

Changer 'LANG' n'a pas réussi à informer la coquille, parce qu'il avait d'autres variables pour vérifier d'abord. –

+0

Vous l'avez, mais quelle est la solution? Ou il n'y a aucun moyen? –