locale 是國際化與本土化過程當中的一個很是重要的概念,我的認爲,對於中文用戶來講,一般會涉及到的國際化或者本土化,大體包含三個方面:看中文,寫中文,與 window中文系統的兼容和通訊。從實際經驗上看來,locale的設定與看中文關係不大,可是與寫中文,及window分區的掛載方式有很密切的關 系。本人認爲就像一個純英文的Windows可以瀏覽中文,日文或者意大利文網頁同樣,你不須要設定locale就能夠看中文。那麼,爲何要設定 locale呢?何時會用到locale呢?
Tags: locale 設定 緣由 解釋
1、爲何要設定locale 正如前面我所講的,設定locale與你可否瀏覽中文的網頁沒有直接的關係,即使你把locale設置成 en_US.ISO-8859-1這樣一個標準的英文locale你照樣能夠瀏覽中文的網頁,只要你的系統裏面有相應的字符集(這個都不必定須要)和合適 的字體(如simsun),瀏覽器就能夠把網頁翻譯成中文給你看。具體的過程是網絡把網頁傳送到你的機器上以後,瀏覽器會判斷相應的編碼的字符集,根據網 頁採用的字符集,去字體庫裏面找合適的字體,而後由文字渲染工具把相應的文字在屏幕上顯示出來。
在下文本人會偶爾把字符集比喻成密碼本,我的以爲對於一些東西比較容易理解,假如你不習慣的話,把全文copy到任何文本編輯器,用字符集替換密碼本便可。
那有時候網頁顯示亂碼或者都是方框是怎麼回事呢?我的認爲,顯示亂碼是由於設定的字符集不對(或者沒有相應的字符集),例如網頁是用UTF-8編碼的,你 非要用GB2312去看,而系統根據GB2312去找字體,而後在屏幕上顯示,固然是一堆的亂碼,也就是說你用一個錯誤的密碼本去翻譯發給你的電報,固然 內容那叫一個亂;至於有些時候瀏覽的網頁能顯示一部分漢字,但有不少的地方是方框,可以顯示漢字說明瀏覽器已經正確的判斷出了網頁的編碼,並在字體庫裏面 找到了相應的文字,可是並非每一個字體庫都包含某個字符集所有的字體的緣故,有些時候會顯示不徹底,找一個比較全的支持較多字符集的字體就能夠了。
既然我可以瀏覽中文網頁,那爲何我還要設定locale呢?
其實你有沒有想過這麼一個問題,爲何gentoo官方論壇上中文論壇的網頁是用UTF-8編碼的(雖然你們一直強烈建議用GB2312編碼),可是新浪 網就是用GB2312編碼的呢?而Xorg的官方網頁居然是ISO-8859-15編碼的,我沒有設定這個locale怎麼同樣的能瀏覽呢?這個問題就像 是你有全部的密碼本,不論某個網站是用什麼字符集編碼的,你均可以用你手裏的密碼本把他們翻譯過來,但問題是雖然你能瀏覽中文網頁,可是在整個操做系統裏 面流動的仍是英文字符。因此,就像你能聽懂英語,也能聽懂中文。 最根本的問題是:你不能夠寫中文。
當你決定要寫什麼東西的時候,首先要決定的一件事情是用那種語言,對於計算機來講就是你要是用哪種字符集,你就必須告訴你的linux系統,你想用那一 本密碼本去寫你想要寫的東西。知道爲何須要用GB2312字符集去瀏覽新浪了吧,由於新浪的網頁是用GB2312寫的。
爲了讓你的Linux可以輸入中文,就須要把系統的locale設定成中文的(嚴格說來是locale中的語言類別LC_CTYPE ),例如 zh_CN.GB23十二、zh_CN.GB18030或者zh_CN.UTF-8。不少人都不明白這些古里古怪的表達方式。這個外星表達式規定了什麼東 西呢?這個問題稍後詳述,如今只須要知道,這是locale的表達方式就能夠了。
2、到底什麼是locale? locale這個單詞中文翻譯成地區或者地域,其實這個單詞包含的意義要寬泛不少。Locale是根據計算機用戶所使用的語言,所在國家或者地區,以及當地的文化傳統所定義的一個軟件運行時的語言環境。
這個用戶環境能夠按照所涉及到的文化傳統的各個方面分紅幾個大類,一般包括用戶所使用的語言符號及其分類(LC_CTYPE),數字 (LC_NUMERIC),比較和排序習慣(LC_COLLATE),時間顯示格式(LC_TIME),貨幣單位(LC_MONETARY),信息主要是 提示信息,錯誤信息, 狀態信息, 標題, 標籤, 按鈕和菜單等(LC_MESSAGES),姓名書寫方式(LC_NAME),地址書寫方式 (LC_ADDRESS),電話號碼書寫方式 (LC_TELEPHONE),度量衡表達方式(LC_MEASUREMENT),默認紙張尺寸大小 (LC_PAPER)和locale對自身包含信息的概述(LC_IDENTIFICATION)。
因此說,locale就是某一個地域內的人們的語言習慣和文化傳統和生活習慣。一個地區的locale就是根據這幾大類的習慣定義的,這些 locale定義文件放在/usr/share/i18n/locales目錄下面,例如en_US, zh_CN and de_DE@euro都是 locale的定義文件,這些文件都是用文本格式書寫的,你能夠用寫字板打開,看看裏邊的內容,固然出了有限的註釋之外,大部分東西可能你都看不懂,由於 是用的Unicode的字符索引方式。
對於de_DE@euro的一點說明,@後邊是修正項,也就是說你能夠看到兩個德國的locale: /usr/share/i18n/locales/de_DE@euro /usr/share/i18n/locales/de_DE 打開這兩個 locale定義,你就會知道它們的差異在於de_DE@euro使用的是歐洲的排序、比較和縮進習慣,而de_DE用的是德國的標準習慣。
上面咱們說到了zh_CN.GB18030的前半部分,後半部分是什麼呢?大部分Linux用戶都知道是系統採用的字符集。
3、什麼是字符集? 字符集就是字符,尤爲是非英語字符在系統內的編碼方式,也就是一般所說的內碼,全部的字符集都放在 /usr/share/i18n/charmaps,全部的字符集也都是用Unicode編號索引的。Unicode用統一的編號來索引目前已知的所有的 符號。而字符集則是這些符號的編碼方式,或者說是在網絡傳輸,計算機內部通訊的時候,對於不一樣字符的表達方式,Unicode是一個靜態的概念,字符集是 一個動態的概念,是每個字符傳遞或傳輸的具體形式。就像 Unicode編號U59D0是表明姐姐的「姐」字,可是具體的這個字是用兩個字節表示,三個字節,仍是四個字節表示,是字符集的問題。例如:UTF-8 字符集就是目前流行的對字符的編碼方式,UTF-8用一個字節表示經常使用的拉丁字母,用兩個字節表示經常使用的符號,包括經常使用的中文字符,用三個表示不經常使用的字 符,用四個字節表示其餘的古靈精怪的字符。而GB2312字符集就是用兩個字節表示全部的字符。須要提到一點的是Unicode除了用編號索引所有字符以 外,自己是用四個字節存儲所有字符,這一點在談到掛載windows分區的時候是很是重要的一個概念。因此說你也能夠把Unicode看做是一種字符集 (我不知道它和UTF-32的關係,反正UTF-32就是用四個字節表示全部的字符的),可是這樣表述符號是很是浪費資源的,由於在計算機世界絕大部分時 候用到的是一個字節就能夠搞定的 26個字母而已。因此纔會有UTF-8,UTF-16等等,要否則大同世界多好,省了這許多麻煩。
4、zh_CN.GB2312究竟是在說什麼? Locale 是軟件在運行時的語言環境, 它包括語言(Language), 地域 (Territory) 和字符集(Codeset)。一個locale的書寫格式爲: 語言[_地域[.字符集]]. 因此說呢,locale老是和必定的字符集相聯繫的。下面舉幾個例子:
一、我說中文,身處×××,使用國標2312字符集來表達字符。 zh_CN.GB2312=中文_×××+國標2312字符集。
二、我說中文,身處×××,使用國標18030字符集來表達字符。 zh_CN.GB18030=中文_×××+國標18030字符集。
三、我說中文,身處×××臺灣省,使用國標Big5字符集來表達字符。 zh_TW.BIG5=中文_臺灣.大五碼字符集
四、我說英文,身處大不列顛,使用ISO-8859-1字符集來表達字符。 en_GB.ISO-8859-1=英文_大不列顛.ISO-8859-1字符集
五、我說德語,身處德國,使用UTF-8字符集,習慣了歐洲風格。
de_DE.UTF-8@euro=德語_德國.UTF-8字符集@按照歐洲習慣加以修正
注意不是
[email]de_DE@euro.UTF[/email]-8,因此徹底的locale表達方式是 [語言[_地域][.字符集] [@修正值]
生成的locale放在/usr/lib/locale/目錄中,而且每一個locale都對應一個文件夾,也就是說建立了
[email]de_DE@euro.UTF[/email]-8 locale以後,就生成/usr/lib/locale/de_DE@euro.UTF-8/目錄,裏面是具體的每一個locale的內容。
5、怎樣去自定義locale 在gentoo生成locale仍是很容易的,首先要在USE裏面加入userlocales支持,而後編輯 locales.build文件,這個文件用來指示glibc生成locale文件。 不少人不明白每個條目是什麼意思。 其實根據上面的說明如今應該很明確了。
File: /etc/locales.build en_US/ISO-8859-1 en_US.UTF-8/UTF-8
zh_CN/GB18030 zh_CN.GBK/GBK zh_CN.GB2312/GB2312 zh_CN.UTF-8/UTF-8
上面是個人locales.build文件,依次的說明是這樣的:
en_US/ISO-8859-1:生成名爲en_US的locale,採用ISO-8859-1字符集,而且把這個locale做爲英文_美國locale類的默認值,其實它和en_US.ISO-8859-1/ISO-8859-1沒有任何區別。
en_US.UTF-8/UTF-8:生成名爲en_US.UTF-8的locale,採用UTF-8字符集。
zh_CN/GB18030:生成名爲zh_CN的locale,採用GB18030字符集,而且把這個locale做爲中文_中國locale類的默認值,其實它和zh_CN.GB18030/GB18030沒有任何區別。
zh_CN.GBK/GBK:生成名爲zh_CN.GBK的locale,採用GBK字符集。 zh_CN.GB2312/GB2312:生成名爲zh_CN.GB2312的locale,採用GB2312字符集。 zh_CN.UTF-8/UTF-8:生成名爲zh_CN.UTF-8的 locale,採用UTF-8字符集。
關於默認locale,默認locale能夠簡寫成en_US或者zh_CN的形式,只是爲了表達簡單而已沒有特別的意義。
Gentoo在locale定義的時候掩蓋了一些東西,也就是locale的生成工具:localedef。 在編譯完glibc以後你能夠用這個localedef 再補充一些locale,就會更加理解locale了。具體的能夠看 localedef 的manpage。
$localedef -f 字符集 -i locale定義文件 生成的locale的名稱 例如 $localedef -f UTF-8 -i zh_CN zh_CN.UTF-8
上面的定義方法和在locales.build中設定zh_CN.UTF-8/UTF-8的結果是同樣同樣的。
6、locale的五臟六腑
剛剛生成了幾個locale,可是爲了讓它們生效,必須告訴Linux系統使用那(幾)個locale。這就須要對locale的內部機制有一點點的了 解。在前面我已經提到過,locale把按照所涉及到的文化傳統的各個方面分紅12個大類,這12個大類分別是: 一、語言符號及其分類 (LC_CTYPE) 二、數字(LC_NUMERIC) 三、比較和排序習慣(LC_COLLATE) 四、時間顯示格式(LC_TIME) 五、貨幣單位(LC_MONETARY) 六、信息主要是提示信息,錯誤信息, 狀態信息, 標題, 標籤, 按鈕和菜單等(LC_MESSAGES) 七、姓名書寫方式(LC_NAME) 八、地址書寫方式(LC_ADDRESS) 九、電話號碼書寫方式(LC_TELEPHONE) 十、度量衡表達方式 (LC_MEASUREMENT) 十一、默認紙張尺寸大小(LC_PAPER) 十二、對locale自身包含信息的概述 (LC_IDENTIFICATION)。
其中,與中文輸入關係最密切的就是 LC_CTYPE, LC_CTYPE 規定了系統內有效的字符以及這些字符的分類,諸如什麼是大寫字母,小寫字母,大小寫轉換,標點符號、可打印字符和其餘的字符屬性等方面。而locale定 義zh_CN中最最重要的一項就是定義了漢字(Class 「hanzi」)這一個大類,固然也是用Unicode描述的,這就讓中文字符在Linux系統中成爲合法的有效字符,並且不論它們是用什麼字符集編碼 的。
LC_CTYPE % This is a copy of the "i18n" LC_CTYPE with the following modifications: - Additional classes: hanzi
copy "i18n"
class "hanzi"; / % ..;/ ..;/ ;;;;;;;;/ ;;;;;;;;/ ;;;; END LC_CTYPE
在en_US的locale定義中,並無定義漢字,因此漢字不是有效字符。因此若是要輸入中文必須使用支持中文的locale,也就是zh_XX,如zh_CN,zh_TW,zh_HK等等。
另外很是重要的一點就是這些分類是彼此獨立的,也就是說LC_CTYPE,LC_COLLATE和 LC_MESSAGES等等分類彼此之間是獨立的,能夠根據用戶的須要設定成不一樣的值。這一點對不少用戶是有利的,甚至是必須的。例如,我就須要一個可以 輸入中文的英文環境,因此我能夠把 LC_CTYPE設定成zh_CN.GB18030,而其餘全部的項都是en_US.UTF-8。
7、怎樣設定locale呢?
設定locale就是設定12大類的locale分類屬性,即 12個LC_*。除了這12個變量能夠設定之外,爲了簡便起見,還有兩個變量: LC_ALL和LANG。它們之間有一個優先級的關係: LC_ALL>LC_*>LANG 能夠這麼說,LC_ALL是最上級設定或者強制設定,而LANG是默認設定值。 一、若是你設定了LC_ALL=zh_CN.UTF-8,那麼無論LC_*和LANG設定成什麼值,它們都會被強制服從 LC_ALL的設定,成爲 zh_CN.UTF-8。 二、假如你設定了LANG=zh_CN.UTF-8,而其餘的LC_*=en_US.UTF-8,而且沒有設定LC_ALL的話,那麼系統的locale 設定以LC_*=en_US.UTF-8。 三、假如你設定了LANG=zh_CN.UTF-8,而其餘的LC_*,和LC_ALL均未設定的話,系統會將LC_*設定成默認值,也就是LANG的值 zh_CN.UTF-8 。 四、假如你設定了 LANG=zh_CN.UTF-8,而其餘的LC_CTYPE=en_US.UTF-8,其餘的LC_*,和LC_ALL均未設定的話,那麼系統的 locale設定將是:LC_CTYPE=en_US.UTF-8,其他的 LC_COLLATE,LC_MESSAGES等等均會採用默認值,也就是 LANG的值,也就是LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=zh_CN.UTF-8。
因此,locale是這樣設定的: 一、若是你須要一個純中文的系統的話,設定LC_ALL= zh_CN.XXXX,或者LANG= zh_CN.XXXX均可以,固然你能夠兩個都設定,但正如上面所講,LC_ALL的值將覆蓋全部其餘的locale設定,不要做無用功。 二、若是你只想要一個能夠輸入中文的環境,而保持菜單、標題,系統信息等等爲英文界面,那麼只須要設定LC_CTYPE=zh_CN.XXXX,LANG = en_US.XXXX就能夠了。這樣LC_CTYPE=zh_CN.XXXX,而LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=en_US.XXXX。 三、假如你高興的話,能夠把12個LC_*一一設定成你須要的值,打造一個古靈精怪的系統: LC_CTYPE=zh_CN.GBK/GBK(使用中文編碼內碼GBK字符集); LC_NUMERIC=en_GB.ISO-8859-1(使用大不列顛的數字系統) LC_MEASUREMEN=de_DE@euro.ISO-8859-15(德國的度量衡使用ISO-8859-15字符集) 羅馬的地址書寫方式,美國的紙張設定……。估計沒人這麼幹吧。 四、假如你什麼也不作的話,也就是LC_ALL,LANG和LC_*均不指定特定值的話,系統將採用POSIX做爲lcoale,也就是C locale。
==========================================================
本文轉自
[url]http://www.canglou.com/blog/read.php?42[/url] ===========================================================