對於國內的Linux用戶,常常煩惱的一個問題是:系統經常在須要顯示中文的時候卻顯示成了亂碼,而因爲某些緣由,須要英文界面的系統的時候,卻苦於系統 不能正常輸入和顯示中文.另外,因爲大部分主要Linux發行版都是以英語爲主體的,英文界面的系統和應用程序無論在界面的美觀程度和穩定程度上都比中文 的略好一些,各類奇怪的BUG也要少一些。所以,不少稍微有英語基礎的Linux用戶都寧願使用英文界面的系統。可是,矛盾又突現出來:在英文系統下,如 何才能正常顯示和輸入中文呢?有沒有一箭雙鵰的方案呢?所以,筆者開始探索如何解決這個問題。個人完美狀態是:系統和應用程序所有爲英文(系統菜單、應用 程序工具欄、默認輸入法等),而我須要閱讀和撰寫中文文檔的時候,能正確的顯示中文並調出中文輸入法。通過嘗試,設置成功,如今以FC4 Linux爲 例,講解一些相關知識和設置過程。 linux
本文主要經過修改系統配置的過程來展示修改linux系統配置的通常思路和過程,若是你不太有耐心看完,請跳過文章的1—4節,直接看第五節快速設置部分。
一,相關變量介紹
咱們知道大部分Linux系統是無所謂中文版和英文版的,以FC4 Linux爲例,系統發行的時候全世界都同樣,系統是中文的仍是英文的徹底取決於你選 擇的語言包。不一樣國家的人在安裝使用的時候選擇屬於本身國家的語言包,應用程序中的語言也不是寫死的,它根據系統的設置來調用相關的語言,因此,一個應用 程序寫出來不通過修改,全世界不一樣國家的用戶均可以以母語界面使用它,這就事所謂的internationalization(國際化),簡稱 i18n。這也是將來軟件的發展趨勢。
那麼,若是我在系統中安裝了不一樣的語言包和不一樣的字體,系統是如何判斷我所要的語言界面並調用相關的字體的呢?系統中那些文件和變量在控制這些呢?
在redHat和FC系列Linux系統下,記錄系統默認使用語言的文件是/etc/sysconfig/i18n,若是默認安裝的是中文的系統,i18n的內容以下:
代碼:
LANG="zh_CN.UTF-8" SYSFONT="latarcyrheb-sun16" SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
其中LANG變量是language的簡稱,稍微有英語基礎的用戶一看就看出來這個變量是決定系統的默認語言的,即系統的菜單、程序的工具欄語言、輸入法默認語言等。SYSFONT是system font的簡稱,決定系統默認用哪種字體。SUPPORTED變量決定系統支持的語言,即系統可以顯示的語言。須要說明的是,因爲計算機起源於英語國家,所以,無論你把這些變量設置成什麼,英語老是默認支持的,並且無論用什麼字體,英文字體總包含在其中。
這些變量中LANG變量是在字符模式和圖形界面下都用到的,在你登陸系統後就被讀取並生效,相信不少人在字符界面下輸入Linux命令的時候常常會遇到顯 示出來的出錯信息是亂碼的狀況,必需安裝zhcon或者cce等字符模式下的中文軟件才能正常顯示中文的出錯信息。若是我不要他顯示中文亂碼,我也不要爲 了看個很簡單的出錯信息而特地起用zhcon那我該怎麼辦呢?一個簡單的零時解決的辦法就是設置一下LANG變量:
代碼:
[root@gucuiwen ~]# LANG="en_US.UTF-8"
即把系統的語言臨時設置成英文,或者更簡單一點,能夠直接這樣:
代碼:
[root@gucuiwen ~]# LANG=""
即把LANG變量清空,因爲英語是不管什麼狀況都支持的,LANG變量被清空後,系統就默認用英語。這樣設置後,在字符模式下輸出的出錯信息等就是全英文 的了。但這種設置是臨時的,只是臨時改變了LANG這個bash變量而已。當退出從新登陸或者切換到其餘字符終端後就無效了。web
到如今,讀者應該想到了,只要把i18n文件中的LANG變量設置成英文的」en_US.UTF-8」,就能夠永久解決這個問題了。修改後的文件以下:
代碼:
#LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16" SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
請不要把LANG變量簡單的清空,由於這個變量不只在字符模式下用到,在圖形界面下也用到,簡單清空在字符模式下確實不會有問題,但在圖形界面下,卻會形成中文沒法正常顯示的狀況,在過去Re d ha t 系列的版本中i18n文件中還有一個叫LANGUAGE的變量,專門控制圖形界面下的語言設置,如今的FC系列中已經把這兩個變量整合成一個變量了。
通過修改這個變量,從新起動圖形界面後,就能夠看到界面一經徹底是英文的了。可是按ctrl+空格卻不能調出中文輸入法,輸入法菜單中也不能添加中文輸入 法。咱們只簡單的修改了LANG變量改變了系統語言設置,固然這一步也能夠用圖形界面下的工具修改,而不用親自修改配置文件。
二,關於運行等級
這個問題彷佛和這篇文章的的主題無關,可是介於如今愈來愈多的linux新手遇到linux圖形界面的問題,並且在中文輸入法設置過程當中也牽涉到這些問題,所以想順便提一下。
如今的linux安裝完成後,默認就運行在第5個系統運行級別。在SYSTEM V 風格的UNIX系統中,系統被分爲不一樣的運行級別,這和BSD分支的UNIX有所不一樣,經常使用的爲0~6七個級別:
0 關機
1 單用戶
2 不帶網絡的多用戶
3 帶網絡的多用戶
4 保留,用戶能夠自給定義
5 圖形界面的多用戶
6 重起系統
因爲如今的Linux系統安裝完後就運行在第5個級別,即系統啓動後直接進入圖形界面,而不用在字符模式下登陸後用startx或者xinit 來起動圖形界面。這樣看起來很方便。可是有什麼壞處呢? 一旦你改變了某些設置,顯示出問題的時候,系統不斷在圖形和字符間派徊,新手又不知道如何應對, 十分麻煩,並且對於學習研究Linux的人來講,這樣不利於瞭解和學習Linux底層的一些東西。很早就用Linux的老用戶都知道,過去的Linux如 redhat6.0,都是默認運行接別爲3,即便後來的RedHat9.0也能夠在安裝時候選默認字符登陸仍是圖形登陸。但如今的FC系列和其餘大多數版 本都無論三七二十一直接幫用戶選擇了直接圖形界面登陸。雖然對於大多數菜鳥來講,Linux確實愈來愈簡單了,可是不少樂趣,那些新手也體驗不到了。
也許你不相信,直接圖形登陸到系統確實會有不少問題,所以,做爲一個有6年Linux使用經驗的Linux和Solaris 系統管理員,我強烈建議在系統安裝完成後把系統的默認運行等級設置在第3級,在字符終端登陸後,再手工輸入startx 命令起動圖形界面。能夠用以下的方法修改:
用文本編輯器修改 /etc/inittab文件,把
代碼:
id:5:initdefault:
這一行,修改爲
代碼:
id:3:initdefault:
保存後就重起,系統就默認起動到字符界面。不一樣運行級別之間的差異的在於系統默認起動的服務的不一樣,如運行級別3默認不啓動X圖形界面服務,而運行級別5 卻默認起動。本質上是沒有區別的,更無所謂不一樣級別間功能強弱的問題。用戶徹底可自給定義不一樣級別的默認服務。在任何運行級別,用戶均可用init 命令來切換到其餘運行級別。
三,調出中文輸入法:
我之因此要在上面費那麼多筆墨來說系統運行級別,是由於對系統的認識是從底部向上開始的。
先把默認運行級別修改爲3級別,固然,若是你實在不想修改,就臨時用init 3命令切換到第3級。
這樣你就能夠用startx起動圖形界面,而後用ctrl+alt+backspace退出圖形界面。請注意我說的是「退出」圖形界面,而不是按ctrl+alt+F2切到一個字符終端。
好了,一切由startx開始。當你須要在Linux系統中設置某個東西,或者配置某個服務的時候,最關鍵的是要知道,這一切是怎麼開始的。知其然必需知 其因此然。若是你有空把/etc/rc.d目錄下的系統起動時運行的腳本通讀一遍,就徹底知道了/etc下的各類配置文件是用來幹什麼的、如何修改、修改 後有什麼效果等等。玩起系統來也能爲所欲爲想怎麼改就怎麼改。這就是我一直強調的,知其然必定要知其因此然。必定要深刻系統,讀腳本,學會用命令和手工修 改系統配置文件。這樣對系統纔會有透徹的瞭解,成天用圖形界面的工具是不能幫助你對系統有教爲透徹深刻的瞭解的,不一樣的linux系統提供的圖形界面配置 程序會不一樣,但命令和配置文件都是相同的,越是底層的東西越具備通用性。因此,應當先學會手動配置和修改系統配置文件,等熟悉了之後,再用圖形界面的工具 修改,以便減小工做量。
上面提了一下我解決問題的思路。我是順着這個思路開始的:
中文輸入法是在圖形界面下使用的,是圖形界面下運行的一個程序。而圖形界面中的一切,都是由startx程序開啓運行的。這就是問題的根源。
找出startx的位置:
代碼:
[root@gucuiwen ~]# which startx /usr/X11R6/bin/startx
看startx是一個腳本仍是二進制文件:
代碼:
[root@gucuiwen ~]# file /usr/X11R6/bin/startx /usr/X11R6/bin/startx: Bourne shell script text executable
發現startx是一個shell 腳本,因而我打開它分析並閱讀,看看能不能找到一些關於輸入法起動過程和相關變量的線索:
代碼:
[root@gucuiwen ~]# vi /usr/X11R6/bin/startx
我找到了該腳本在運行過程當中調用的其餘腳本和配置文件的信息:
代碼:
userclientrc=HOME/.xinitrcuserserverrc=HOME/.xserverrc sysclientrc=/etc/X11/xinit/xinitrc sysserverrc=/etc/X11/xinit/xserverrc
而且知道,startx的目的是尋找系統中可用的桌面系統X服務器系統、以及用戶自定義的參數,最終調用xinit來初始化X圖形界面。我沒有在 startx腳本中找到直接和起動輸入法相關的代碼,因而就能夠確定,輸入法相關的代碼在startx調用的腳本中。因而我來到
/etc/X11/xinit/ 目錄下,閱讀並分析該目錄下的腳本,這些腳本有些是startx直接調用的,有些是被startx調用的腳本再調用的,存在着多級嵌套的關係,沒有一點耐 心還真是搞不清楚。最終我在/etc/X11/xinit/xinitrc.d目錄中的xinput.sh腳本中找到了和輸入法相關的代碼:
代碼:
lang_region=(echotmplang | sed -e 's/"..*//') lang_region="zh_CN" #這一行是修改後加上去的 for f in HOME/.xinput.d/{lang_region} " HOME/.xinput.d/default"/etc/X11/xinit/xinput.d/{lang_region} " /etc/X11/xinit/xinput.d/default ; do [ -r f ]
&& sourcef && break done
經過分析腳本,我知道,圖形界面啓動的時候腳本是根據LANG變量來決定是否啓用輸入法,以及啓用哪一種語言的輸入法等。問題在於:咱們尚未把LANG變 量改爲英語以前,系統獲得的LANG變量是中文的,所以,它知道須要在圖形界面啓動過程當中啓用中文輸入法,但把LANG變量改爲英文後,系統根據LANG 變量知道系統是英文的,它便再也不啓動中文輸入法,也再也不設置和導出相關的變量,致使中文輸入法不可用。所以,只要在這個腳本中,「騙」過系統,讓輸入法腳 本「覺得」系統是中文的,它不就運行中文輸入法,並導出相關變量了嗎? 因而,經過分析腳本,我在xinput.sh中的:
代碼:
shell
lang_region=(echotmplang | sed -e 's/"..*//') 後面又添加了 lang_region="zh_CN" bash
直接把lang_region=(echotmplang | sed -e 's/"..*//') 修改爲 lang_region="zh_CN" 也能夠
多添加一行是爲了之後改過來方便,直接刪除添加的一行就能夠了。
固然,把for循環中的/etc/X11/xinit/xinput.d/{lang_region}該成
/etc/X11/xinit/xinput.d/zh _CN也能夠。
固然還有其餘的改法,前提是你要懂得shell
腳本的語法,看得懂腳本的意思。這樣修改後,即使系統是英文的,xinput.sh腳本也會去讀取/etc/X11/xinit/xinput.d/zh
_CN 文件並導出其中的內容、設置好XMODIFERS等輸入法變量,並運行iiimx輸入法程序。
那麼爲何不在圖形界面啓動後直接運行iiimx輸入法程序呢?實驗一下就知道,這根本不行。由於輸入法程序是需要和被輸入的應用程序配合運行的軟件,在運行過程當中須要導出不少變量。直接運行iiimx只運行了主程序,而沒相關變量,沒辦法和應用程序配合完成輸入工做。
完成修改工做後,保存腳本文件。輸入startx命令啓動圖形界面,就能夠用全英文的系統界面和中文輸入法了。但須要注意的是:因爲系統是全英文的,默認
輸入法也是英文,經過GNOME或者KDE菜單起動的應用程序第一次輸入中文的時候不能按ctrl+空格來切換到中文,須要用鼠標在任務欄上點擊輸入法圖
標切換,第一次切換後之後就能夠用ctrl+空格快捷鍵來切換中英文輸入法了。
四,一些後續問題
某些軟件,好比Open
Office,經過GNOME或者KDE菜單啓動的話,即便切換到中文輸入法也輸不進中文,這是由於整個桌面系統的環境是英文的,軟件「繼承」了英文環境
的相關變量,這些軟件就「認死理」,就是不讓輸入中文,這時候能夠打開一個gnome終端,把LANG變量臨時設置成zh_CN.UTF-8 :
[root@gucuiwen ~]# LANG="zh_CN.UTF-8"
而後在這個gnome終端中,用命令打開open office:
[root@gucuiwen ~]# oowriter
&
這樣Open
Office就「繼承」了gnome終端的LANG變量,起動後,工具欄和菜單等都是中文的,並且能輸入中文。推而廣之,任何軟件均可以用這種方法,根據
須要,打開中文界面的軟件和英文界面的軟件。要以英文界面運行軟件時,只要從GNOME或者KDE菜單打開,要用中文界面運行軟件時,在終端中修該
LANG變量,從修改過LANG變量的終端中經過命令運行便可。固然,若是你還安裝了其餘語言的字體,你還能夠以其餘語言的界面來運行程序。如日語:
[root@gucuiwen ~]# LANG="ja_JP.UTF-8"
[root@gucuiwen ~]# gedit &
我用上面的兩條命令打開的gedit
編輯器就是全日語界面的,可是能輸入中文和英文,並顯示日文。從而達到,一個系統,多種語言和文字共存的目的。
固然,前提是要安裝了日語字體和日語locale,不然全部有文字的地方會所有顯示成一連串問號。總之,要先懂得原理,以後想怎麼玩就怎麼玩,爲所欲爲,徹底不受限制,充分享受用Linux的樂趣。
五, 快速設置步驟:
1.修改/etc/sysconf/i18n文件,把
LANG="zh_CN.UTF-8"
修改爲:
LANG="en_US.UTF-8"
2.修改/etc/X11/xinit/xinitrc.d/xinput.sh文件,把其中一行:
lang_region=(echo $tmplang | sed -e 's/"..*//')
修改爲:
lang_region=」zh_CN」 服務器