本篇內(nèi)容介紹了“Linux系統(tǒng)中如何編碼設(shè)置顯示中文”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元景寧畬族自治做網(wǎng)站,已為上家服務(wù),為景寧畬族自治各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
一,相關(guān)變量介紹
我們知道大部分Linux系統(tǒng)是無(wú)所謂中文版和英文版的,以FC4 Linux為例,系統(tǒng)發(fā)行的時(shí)候全世界都一樣,系統(tǒng)是中文的還是英文的完全取決于你選擇的語(yǔ)言包。不同國(guó)家的人在安裝使用的時(shí)候選擇屬于自己國(guó)家的語(yǔ)言包,應(yīng)用程序中的語(yǔ)言也不是寫(xiě)死的,它根據(jù)系統(tǒng)的設(shè)置來(lái)調(diào)用相關(guān)的語(yǔ)言,所以,一個(gè)應(yīng)用程序?qū)懗鰜?lái)不經(jīng)過(guò)修改,全世界不同國(guó)家的用戶都可以以母語(yǔ)界面使用它,這就事所謂的internationalization(國(guó)際化),簡(jiǎn)稱 i18n。這也是未來(lái)軟件的發(fā)展趨勢(shì)。
那么,如果我在系統(tǒng)中安裝了不同的語(yǔ)言包和不同的字體,系統(tǒng)是如何判斷我所要的語(yǔ)言界面并調(diào)用相關(guān)的字體的呢?系統(tǒng)中那些文件和變量在控制這些呢?
在redHat和FC系列Linux系統(tǒng)下,記錄系統(tǒng)默認(rèn)使用語(yǔ)言的文件是/etc/sysconfig/i18n,如果默認(rèn)安裝的是中文的系統(tǒng),i18n的內(nèi)容如下:
代碼:
代碼如下:
LANG="zh_CN.UTF-8" SYSFONT="latarcyrheb-sun16" SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
其中LANG變量是language的簡(jiǎn)稱,稍微有英語(yǔ)基礎(chǔ)的用戶一看就看出來(lái)這個(gè)變量是決定系統(tǒng)的默認(rèn)語(yǔ)言的,即系統(tǒng)的菜單、程序的工具欄語(yǔ)言、輸入法默認(rèn)語(yǔ)言等。SYSFONT是system font的簡(jiǎn)稱,決定系統(tǒng)默認(rèn)用哪一種字體。SUPPORTED變量決定系統(tǒng)支持的語(yǔ)言,即系統(tǒng)能夠顯示的語(yǔ)言。需要說(shuō)明的是,由于計(jì)算機(jī)起源于英語(yǔ)國(guó)家,因此,不管你把這些變量設(shè)置成什么,英語(yǔ)總是默認(rèn)支持的,而且不管用什么字體,英文字體總包含在其中。
這些變量中LANG變量是在字符模式和圖形界面下都用到的,在你登錄系統(tǒng)后就被讀取并生效,相信很多人在字符界面下輸入Linux命令的時(shí)候經(jīng)常會(huì)遇到顯示出來(lái)的出錯(cuò)信息是亂碼的情況,必需安裝zhcon或者cce等字符模式下的中文軟件才能正常顯示中文的出錯(cuò)信息。如果我不要他顯示中文亂碼,我也不要為了看個(gè)很簡(jiǎn)單的出錯(cuò)信息而特意起用zhcon那我該怎么辦呢?一個(gè)簡(jiǎn)單的零時(shí)解決的辦法就是設(shè)置一下LANG變量:
代碼:
代碼如下:
[root@gucuiwen ~]# LANG="en_US.UTF-8"
即把系統(tǒng)的語(yǔ)言臨時(shí)設(shè)置成英文,或者更簡(jiǎn)單一點(diǎn),可以直接這樣:
代碼:
代碼如下:
[root@gucuiwen ~]# LANG=""
即把LANG變量清空,由于英語(yǔ)是無(wú)論什么情況都支持的,LANG變量被清空后,系統(tǒng)就默認(rèn)用英語(yǔ)。這樣設(shè)置后,在字符模式下輸出的出錯(cuò)信息等就是全英文的了。但這種設(shè)置是臨時(shí)的,只是臨時(shí)改變了LANG這個(gè)bash變量而已。當(dāng)退出重新登錄或者切換到其他字符終端后就無(wú)效了。
到現(xiàn)在,讀者應(yīng)該想到了,只要把i18n文件中的LANG變量設(shè)置成英文的”en_US.UTF-8”,就可以永久解決這個(gè)問(wèn)題了。修改后的文件如下:
代碼:
代碼如下:
#LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16" SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
請(qǐng)不要把LANG變量簡(jiǎn)單的清空,因?yàn)檫@個(gè)變量不僅在字符模式下用到,在圖形界面下也用到,簡(jiǎn)單清空在字符模式下確實(shí)不會(huì)有問(wèn)題,但在圖形界面下,卻會(huì)造成中文無(wú)法正常顯示的情況,在過(guò)去Re d ha t 系列的版本中i18n文件中還有一個(gè)叫LANGUAGE的變量,專門(mén)控制圖形界面下的語(yǔ)言設(shè)置,現(xiàn)在的FC系列中已經(jīng)把這兩個(gè)變量整合成一個(gè)變量了。
經(jīng)過(guò)修改這個(gè)變量,重新起動(dòng)圖形界面后,就可以看到界面一經(jīng)完全是英文的了。但是按ctrl+空格卻不能調(diào)出中文輸入法,輸入法菜單中也不能添加中文輸入法。我們只簡(jiǎn)單的修改了LANG變量改變了系統(tǒng)語(yǔ)言設(shè)置,當(dāng)然這一步也可以用圖形界面下的工具修改,而不用親自修改配置文件。
二,關(guān)于運(yùn)行等級(jí)
這個(gè)問(wèn)題似乎和這篇文章的的主題無(wú)關(guān),但是介于現(xiàn)在越來(lái)越多的linux新手遇到linux圖形界面的問(wèn)題,而且在中文輸入法設(shè)置過(guò)程中也牽涉到這些問(wèn)題,因此想順便提一下。
現(xiàn)在的linux安裝完成后,默認(rèn)就運(yùn)行在第5個(gè)系統(tǒng)運(yùn)行級(jí)別。在SYSTEM V 風(fēng)格的UNIX系統(tǒng)中,系統(tǒng)被分為不同的運(yùn)行級(jí)別,這和BSD分支的UNIX有所不同,常用的為0~6七個(gè)級(jí)別:
0 關(guān)機(jī)
1 單用戶
2 不帶網(wǎng)絡(luò)的多用戶
3 帶網(wǎng)絡(luò)的多用戶
4 保留,用戶可以自給定義
5 圖形界面的多用戶
6 重起系統(tǒng)
由于現(xiàn)在的Linux系統(tǒng)安裝完后就運(yùn)行在第5個(gè)級(jí)別,即系統(tǒng)啟動(dòng)后直接進(jìn)入圖形界面,而不用在字符模式下登錄后用startx或者xinit 來(lái)起動(dòng)圖形界面。這樣看起來(lái)很方便。但是有什么壞處呢? 一旦你改變了某些設(shè)置,顯示出問(wèn)題的時(shí)候,系統(tǒng)不斷在圖形和字符間派徊,新手又不知道如何應(yīng)對(duì),十分麻煩,而且對(duì)于學(xué)習(xí)研究Linux的人來(lái)說(shuō),這樣不利于了解和學(xué)習(xí)Linux底層的一些東西。很早就用Linux的老用戶都知道,過(guò)去的Linux如 redhat6.0,都是默認(rèn)運(yùn)行接別為3,即使后來(lái)的RedHat9.0也可以在安裝時(shí)候選默認(rèn)字符登錄還是圖形登錄。但現(xiàn)在的FC系列和其他大多數(shù)版本都不管三七二十一直接幫用戶選擇了直接圖形界面登錄。雖然對(duì)于大多數(shù)菜鳥(niǎo)來(lái)說(shuō),Linux確實(shí)越來(lái)越簡(jiǎn)單了,但是很多樂(lè)趣,那些新手也體驗(yàn)不到了。
也許你不相信,直接圖形登錄到系統(tǒng)確實(shí)會(huì)有很多問(wèn)題,因此,作為一個(gè)有6年Linux使用經(jīng)驗(yàn)的Linux和Solaris 系統(tǒng)管理員,我強(qiáng)烈建議在系統(tǒng)安裝完成后把系統(tǒng)的默認(rèn)運(yùn)行等級(jí)設(shè)置在第3級(jí),在字符終端登錄后,再手工輸入startx 命令起動(dòng)圖形界面??梢杂萌缦碌姆椒ㄐ薷模?br/>用文本編輯器修改 /etc/inittab文件,把
代碼:
代碼如下:
id:5:initdefault:
這一行,修改成
代碼:
代碼如下:
id:3:initdefault:
保存后就重起,系統(tǒng)就默認(rèn)起動(dòng)到字符界面。不同運(yùn)行級(jí)別之間的差別的在于系統(tǒng)默認(rèn)起動(dòng)的服務(wù)的不同,如運(yùn)行級(jí)別3默認(rèn)不啟動(dòng)X圖形界面服務(wù),而運(yùn)行級(jí)別5 卻默認(rèn)起動(dòng)。本質(zhì)上是沒(méi)有區(qū)別的,更無(wú)所謂不同級(jí)別間功能強(qiáng)弱的問(wèn)題。用戶完全可自給定義不同級(jí)別的默認(rèn)服務(wù)。在任何運(yùn)行級(jí)別,用戶都可用init 命令來(lái)切換到其他運(yùn)行級(jí)別。
三,調(diào)出中文輸入法:
我之所以要在上面費(fèi)那么多筆墨來(lái)講系統(tǒng)運(yùn)行級(jí)別,是因?yàn)閷?duì)系統(tǒng)的認(rèn)識(shí)是從底部向上開(kāi)始的。
先把默認(rèn)運(yùn)行級(jí)別修改成3級(jí)別,當(dāng)然,如果你實(shí)在不想修改,就臨時(shí)用init 3命令切換到第3級(jí)。
這樣你就可以用startx起動(dòng)圖形界面,然后用ctrl+alt+backspace退出圖形界面。請(qǐng)注意我說(shuō)的是“退出”圖形界面,而不是按ctrl+alt+F2切到一個(gè)字符終端。
好了,一切由startx開(kāi)始。當(dāng)你需要在Linux系統(tǒng)中設(shè)置某個(gè)東西,或者配置某個(gè)服務(wù)的時(shí)候,最關(guān)鍵的是要知道,這一切是怎么開(kāi)始的。知其然必需知其所以然。如果你有空把/etc/rc.d目錄下的系統(tǒng)起動(dòng)時(shí)運(yùn)行的腳本通讀一遍,就完全知道了/etc下的各種配置文件是用來(lái)干什么的、如何修改、修改后有什么效果等等。玩起系統(tǒng)來(lái)也能隨心所欲想怎么改就怎么改。這就是我一直強(qiáng)調(diào)的,知其然一定要知其所以然。一定要深入系統(tǒng),讀腳本,學(xué)會(huì)用命令和手工修改系統(tǒng)配置文件。這樣對(duì)系統(tǒng)才會(huì)有透徹的了解,整天用圖形界面的工具是不能幫助你對(duì)系統(tǒng)有教為透徹深入的了解的,不同的linux系統(tǒng)提供的圖形界面配置程序會(huì)不同,但命令和配置文件都是相同的,越是底層的東西越具有通用性。所以,應(yīng)當(dāng)先學(xué)會(huì)手動(dòng)配置和修改系統(tǒng)配置文件,等熟悉了以后,再用圖形界面的工具修改,以便減少工作量。
上面提了一下我解決問(wèn)題的思路。我是順著這個(gè)思路開(kāi)始的:
中文輸入法是在圖形界面下使用的,是圖形界面下運(yùn)行的一個(gè)程序。而圖形界面中的一切,都是由startx程序開(kāi)啟運(yùn)行的。這就是問(wèn)題的根源。
找出startx的位置:
代碼:
代碼如下:
[root@gucuiwen ~]# which startx /usr/X11R6/bin/startx
看startx是一個(gè)腳本還是二進(jìn)制文件:
代碼:
代碼如下:
[root@gucuiwen ~]# file /usr/X11R6/bin/startx /usr/X11R6/bin/startx: Bourne shell script text executable
發(fā)現(xiàn)startx是一個(gè)shell 腳本,于是我打開(kāi)它分析并閱讀,看看能不能找到一些關(guān)于輸入法起動(dòng)過(guò)程和相關(guān)變量的線索:
代碼:
代碼如下:
[root@gucuiwen ~]# vi /usr/X11R6/bin/startx
我找到了該腳本在運(yùn)行過(guò)程中調(diào)用的其他腳本和配置文件的信息:
代碼:
代碼如下:
userclientrc=$HOME/.xinitrc userserverrc=$HOME/.xserverrc sysclientrc=/etc/X11/xinit/xinitrc sysserverrc=/etc/X11/xinit/xserverrc
并且知道,startx的目的是尋找系統(tǒng)中可用的桌面系統(tǒng)X服務(wù)器系統(tǒng)、以及用戶自定義的參數(shù),最終調(diào)用xinit來(lái)初始化X圖形界面。我沒(méi)有在startx腳本中找到直接和起動(dòng)輸入法相關(guān)的代碼,于是就可以肯定,輸入法相關(guān)的代碼在startx調(diào)用的腳本中。于是我來(lái)到
/etc/X11/xinit/ 目錄下,閱讀并分析該目錄下的腳本,這些腳本有些是startx直接調(diào)用的,有些是被startx調(diào)用的腳本再調(diào)用的,存在著多級(jí)嵌套的關(guān)系,沒(méi)有一點(diǎn)耐心還真是搞不清楚。最終我在/etc/X11/xinit/xinitrc.d目錄中的xinput.sh腳本中找到了和輸入法相關(guān)的代碼:
代碼:
代碼如下:
lang_region=$(echo $tmplang | 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 ] && source $f && break done
通過(guò)分析腳本,我知道,圖形界面啟動(dòng)的時(shí)候腳本是根據(jù)LANG變量來(lái)決定是否啟用輸入法,以及啟用哪種語(yǔ)言的輸入法等。問(wèn)題在于:我們還沒(méi)有把LANG變量改成英語(yǔ)之前,系統(tǒng)得到的LANG變量是中文的,因此,它知道需要在圖形界面啟動(dòng)過(guò)程中啟用中文輸入法,但把LANG變量改成英文后,系統(tǒng)根據(jù)LANG 變量知道系統(tǒng)是英文的,它便不再啟動(dòng)中文輸入法,也不再設(shè)置和導(dǎo)出相關(guān)的變量,導(dǎo)致中文輸入法不可用。因此,只要在這個(gè)腳本中,“騙”過(guò)系統(tǒng),讓輸入法腳本“以為”系統(tǒng)是中文的,它不就運(yùn)行中文輸入法,并導(dǎo)出相關(guān)變量了嗎? 于是,通過(guò)分析腳本,我在xinput.sh中的:
代碼:
代碼如下:
lang_region=$(echo $tmplang | sed -e 's/"..*//') 后面又添加了 lang_region="zh_CN"
直接把lang_region=$(echo $tmplang | sed -e 's/"..*//') 修改成 lang_region="zh_CN" 也可以
多添加一行是為了以后改過(guò)來(lái)方便,直接刪除添加的一行就可以了。
當(dāng)然,把for循環(huán)中的/etc/X11/xinit/xinput.d/${lang_region}該成
/etc/X11/xinit/xinput.d/zh _CN也可以。
當(dāng)然還有其他的改法,前提是你要懂得shell 腳本的語(yǔ)法,看得懂腳本的意思。這樣修改后,即便系統(tǒng)是英文的,xinput.sh腳本也會(huì)去讀取/etc/X11/xinit/xinput.d/zh _CN 文件并導(dǎo)出其中的內(nèi)容、設(shè)置好XMODIFERS等輸入法變量,并運(yùn)行iiimx輸入法程序。
那么為什么不在圖形界面啟動(dòng)后直接運(yùn)行iiimx輸入法程序呢?實(shí)驗(yàn)一下就知道,這根本不行。因?yàn)檩斎敕ǔ绦蚴琼氁捅惠斎氲膽?yīng)用程序配合運(yùn)行的軟件,在運(yùn)行過(guò)程中需要導(dǎo)出很多變量。直接運(yùn)行iiimx只運(yùn)行了主程序,而沒(méi)相關(guān)變量,沒(méi)辦法和應(yīng)用程序配合完成輸入工作。
完成修改工作后,保存腳本文件。輸入startx命令啟動(dòng)圖形界面,就可以用全英文的系統(tǒng)界面和中文輸入法了。但需要注意的是:由于系統(tǒng)是全英文的,默認(rèn)輸入法也是英文,通過(guò)GNOME或者KDE菜單起動(dòng)的應(yīng)用程序第一次輸入中文的時(shí)候不能按ctrl+空格來(lái)切換到中文,需要用鼠標(biāo)在任務(wù)欄上點(diǎn)擊輸入法圖標(biāo)切換,第一次切換后以后就可以用ctrl+空格快捷鍵來(lái)切換中英文輸入法了。
四,一些后續(xù)問(wèn)題
某些軟件,比如Open Office,通過(guò)GNOME或者KDE菜單啟動(dòng)的話,即使切換到中文輸入法也輸不進(jìn)中文,這是因?yàn)檎麄€(gè)桌面系統(tǒng)的環(huán)境是英文的,軟件“繼承”了英文環(huán)境的相關(guān)變量,這些軟件就“認(rèn)死理”,就是不讓輸入中文,這時(shí)候可以打開(kāi)一個(gè)gnome終端,把LANG變量臨時(shí)設(shè)置成zh_CN.UTF-8?。?br/>
代碼如下:
[root@gucuiwen ~]# LANG="zh_CN.UTF-8"
然后在這個(gè)gnome終端中,用命令打開(kāi)open office:
代碼如下:
[root@gucuiwen ~]# oowriter &
這樣Open Office就“繼承”了gnome終端的LANG變量,起動(dòng)后,工具欄和菜單等都是中文的,而且能輸入中文。推而廣之,任何軟件都可以用這種方法,根據(jù)需要,打開(kāi)中文界面的軟件和英文界面的軟件。要以英文界面運(yùn)行軟件時(shí),只要從GNOME或者KDE菜單打開(kāi),要用中文界面運(yùn)行軟件時(shí),在終端中修該 LANG變量,從修改過(guò)LANG變量的終端中通過(guò)命令運(yùn)行即可。當(dāng)然,如果你還安裝了其他語(yǔ)言的字體,你還可以以其他語(yǔ)言的界面來(lái)運(yùn)行程序。如日語(yǔ):
代碼如下:
[root@gucuiwen ~]# LANG="ja_JP.UTF-8"
[root@gucuiwen ~]# gedit &
我用上面的兩條命令打開(kāi)的gedit 編輯器就是全日語(yǔ)界面的,但是能輸入中文和英文,并顯示日文。從而達(dá)到,一個(gè)系統(tǒng),多種語(yǔ)言和文字共存的目的。
當(dāng)然,前提是要安裝了日語(yǔ)字體和日語(yǔ)locale,否則所有有文字的地方會(huì)全部顯示成一連串問(wèn)號(hào)??傊?,要先懂得原理,之后想怎么玩就怎么玩,隨心所欲,完全不受限制,充分享受用Linux的樂(lè)趣。
五, 快速設(shè)置步驟:
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”
3,重新啟動(dòng)圖形界面,就可以用英文的界面并且正確顯示中文和輸入中文。
“Linux系統(tǒng)中如何編碼設(shè)置顯示中文”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!