2017-05-13 46 views
2

我试图通过更改LANG变量来更改urxvt当前会话中的编码。不过,它似乎不适合立即应用。这是我做的:如何在当前终端的会话中设置区域设置?

可用语言:

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

在设置新的语言环境:通过运行$ urxvt &最后

$ export LANG=ru_RU.KOI8-R 
$ echo "а" | od -t x1 
0000000 d0 b0 0a # hm..expect 'c1 0a' 

叉新urxvt例如:

$ echo "а" | od -t x1 
0000000 d0 b0 0a # good! UTF-8 
#  | a ||NL| 

后得到我想要的:

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

为什么LANG首先改变行为?

+0

发表了一个适用于'bash' shell的答案,其登录shell是'urxvt'使用? – Inian

+0

通过'urxvt'读取哪些启动文件,在那里添加包含更改语言环境的行。它应该反映它为您的所有后续会话。 – Inian

+0

可能它使用bash。 '在那里添加更改语言环境的行 - - 问题不在于更改语言环境,而是在CURRENT会话中更改它。我知道我可以把这行放在.bash_profile或.bashrc - 但这不是我想要的。 –

回答

3

的因素有两个:

    您可使用带有外壳
  • 内置回波(并没有被告知,要更改的语言环境的外壳)
  • LANG不是检查第一个环境变量。据locale(7)LC_ALLLC_CTYPE将首先检查:
 
     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. 

对于后者,看看从locale命令,它会列出所有将要使用的环境变量的输出:

$ 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 

只是改变LANG不应CH愤怒的其他变量,但改变LC_ALL一般这样做。

$ 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

'(并没有通知shell会改变语言环境)' - 如果是的话,该怎么做? '猫'的输出相同。顺便说一句,我已经尝试了'LC_ALL'的建议 - 仍然不起作用(如果对编码标准输入更加明确)。 –

+0

更改'LANG'没有成功通知shell,因为它有其他变量需要先检查。 –

+0

明白了,但解决方案是什么?或者没有办法? –

相关问题