2017-05-13 47 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

明白了,但解決方案是什麼?或者沒有辦法? –

相關問題