Linux LANG變數設定:定義系統的主語系環境

2020-07-16 10:04:33
LANG 變數定義了 Linux 系統的主語系環境,這個變數的預設值如下:

[[email protected] src]# echo $LANG
zh_CN.UTF-8

這是因為我們在安裝 Linux 時選擇的是中文安裝,所以預設的主語系變數是"zh_CN.UTF-8"。那麼,Linux 系統中到底支援多少種語系呢?我們可以使用以下命令查詢:

[[email protected] src]# locale -a | more
aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
…省略部分輸出…
#查詢支援的語系
[[email protected] src]# locale -a | wc -l
735
#實在太多,這裡只統計數量

既然 Linux 系統支援這麼多種語系,那麼當前系統使用的到底是什麼語系呢?使用 locale 命令直接查詢,命令如下:

[[email protected] src]# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8n
LC_NAME="zh_CN.U 丁 F-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8n
LC_MEASUREMENT="zh_CN.U 丁 F-8"
LC_IDENTIFICATI0N=Mzh_CN.UTF-8M
LC_ALL=

在 Linux 系統中,語系主要是通過這些變數來設定的,這裡只需知道 LANG 和 LC_ALL 變數即可,其他的變數會依賴這兩個變數的值而發生變化。LANG 是定義系統主語系的變數,LC_ALL 是定義整體語系的變數,一般使用 LANG 變數來定義系統語系。

我們還要通過檔案 /etc/sysconfig/i18n 定義系統的預設語系,檢視一下這個檔案的內容,如下:

[[email protected] src]# cat /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"

這又是當前系統語系,又是預設語系,有沒有快暈倒的感覺?解釋一下吧,我們可以這樣理解:預設語系是下次重新啟動之後系統所使用的語系;而當前系統語系是當前系統所使用的語系。

如果系統重新啟動,則會從預設語系組態檔 /etc/sysconfig/i18n 中讀出語系,然後賦予變數 LANG,讓這個語系生效。也就是說,LANG 變數定義的語系只對當前系統生效;要想永久生效,就要修改 /etc/sysconfig/i18n 檔案。

說到這裡,我們需要解釋一下 Linux 中文支援的問題。是不是只要定義了語系為中文語系,如 zh_CN.UTF-8,就可以正確顯示中文了呢?這要分情況,如果是在圖形介面中,或者使用遠端連線工具(如 SecureCRT、Xshell 等),那麼,只要正確設定了語系,是可以正確顯示中文的。當然,遠端接工具也要設定正確的語系環境。

如果是純字元介面(本地終端 tty1~tty6),是不能顯示中文的,因為 Linux 的純字元介面是不能顯示中文這麼複雜的編碼的。如果非要在純字元介面中顯示中文,那麼只能安裝中文外掛,如 zhcon 等。

舉個例子,先來看看在遠端連線工具中顯示中文的情況,如下:

[[email protected] src]# echo $LANG
zh_CN.UTF-8
#當前使用遠端連線工具,只要語系正確,就可以正確顯示中文
[[email protected] src]# df
檔案系統 1K-塊 已用 可用 已用% 掛載點
/dev/sda3 19923216 1813532 17097616 10%/
tmpfs 312672 0 312672 0%/dev/shm
/dev/sda1 198337 26359 161738 15%/boot
#使用df命令可以看到中文是正常顯示的

但如果是純字元介面呢?雖然 Linux 是中文安裝的,但純字元介面的語系卻是"en_US.UTF~8",如圖 1 所示。


圖 1 純字元介面的語系