<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    GHawk

    關于locale的設定 (轉)

    ?
    locale是國際化與本土化過程中的一個非常重要的概念,個人認為,對于中文用戶來說,通常會涉及到的國際化或者本土化,大致包含三個方面:看中文,寫中文,與window中文系統的兼容和通信。從實際經驗上看來,locale的設定與看中文關系不大,但是與寫中文,及window分區的掛載方式有很密切的關系。本人認為就像一個純英文的Windows能夠瀏覽中文,日文或者意大利文網頁一樣,你不需要設定locale就可以看中文。那么,為什么要設定locale呢?什么時候會用到locale呢?

    一、為什么要設定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.GB2312、zh_CN.GB18030或者zh_CN.UTF-8。很多人都不明白這些古里古怪的表達方式。這個外星表達式規定了什么東西呢?這個問題稍后詳述,現在只需要知道,這是locale的表達方式就可以了。
    ?
    二、到底什么是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用戶都知道是系統采用的字符集。
    ?
    三、什么是字符集?
    字符集就是字符,尤其是非英語字符在系統內的編碼方式,也就是通常所說的內碼,所有的字符集都放在/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等等,要不然大同世界多好,省了這許多麻煩。
    ?

    四、zh_CN.GB2312到底是在說什么?
    Locale 是軟件在運行時的語言環境, 它包括語言(Language), 地域 (Territory) 和字符集(Codeset)。一個locale的書寫格式為: 語言[_地域[.字符集]]. 所以說呢,locale總是和一定的字符集相聯系的。下面舉幾個例子:
    ?
    1、我說中文,身處中華人民共和國,使用國標2312字符集來表達字符。
    zh_CN.GB2312=中文_中華人民共和國+國標2312字符集。
    ?
    2、我說中文,身處中華人民共和國,使用國標18030字符集來表達字符。
    zh_CN.GB18030=中文_中華人民共和國+國標18030字符集。
    ?
    3、我說中文,身處中華人民共和國臺灣省,使用國標Big5字符集來表達字符。
    zh_TW.BIG5=中文_臺灣.大五碼字符集
    ?
    4、我說英文,身處大不列顛,使用ISO-8859-1字符集來表達字符。
    en_GB.ISO-8859-1=英文_大不列顛.ISO-8859-1字符集
    ?
    5、我說德語,身處德國,使用UTF-8字符集,習慣了歐洲風格。
    de_DE.UTF-8@euro=德語_德國.UTF-8字符集@按照歐洲習慣加以修正
    ?
    注意不是de_DE@euro.UTF-8,所以完全的locale表達方式是
    [語言[_地域][.字符集] [@修正值]
    ?
    生成的locale放在/usr/lib/locale/目錄中,并且每個locale都對應一個文件夾,也就是說創建了de_DE@euro.UTF-8 locale之后,就生成/usr/lib/locale/de_DE@euro.UTF-8/目錄,里面是具體的每個locale的內容。
    ?
    五、怎樣去自定義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的結果是一樣一樣的。
    ?

    六、locale的五臟六腑
    ?
    剛剛生成了幾個locale,但是為了讓它們生效,必須告訴Linux系統使用那(幾)個locale。這就需要對locale的內部機制有一點點的了解。在前面我已經提到過,locale把按照所涉及到的文化傳統的各個方面分成12個大類,這12個大類分別是:
    1、語言符號及其分類(LC_CTYPE)
    2、數字(LC_NUMERIC)
    3、比較和排序習慣(LC_COLLATE)
    4、時間顯示格式(LC_TIME)
    5、貨幣單位(LC_MONETARY)
    6、信息主要是提示信息,錯誤信息, 狀態信息, 標題, 標簽, 按鈕和菜單等(LC_MESSAGES)
    7、姓名書寫方式(LC_NAME)
    8、地址書寫方式(LC_ADDRESS)
    9、電話號碼書寫方式(LC_TELEPHONE)
    10、度量衡表達方式(LC_MEASUREMENT)
    11、默認紙張尺寸大小(LC_PAPER)
    12、對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"; /
    % <U3400>..<U4DBF>;/
    <U4E00>..<U9FA5>;/
    <UF92C>;<UF979>;<UF995>;<UF9E7>;<UF9F1>;<UFA0C>;<UFA0D>;<UFA0E>;/
    <UFA0F>;<UFA11>;<UFA13>;<UFA14>;<UFA18>;<UFA1F>;<UFA20>;<UFA21>;/
    <UFA23>;<UFA24>;<UFA27>;<UFA28>;<UFA29>
    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。
    ?

    七、怎樣設定locale呢?
    ?
    設定locale就是設定12大類的locale分類屬性,即 12個LC_*。除了這12個變量可以設定以外,為了簡便起見,還有兩個變量:LC_ALL和LANG。它們之間有一個優先級的關系:
    LC_ALL>LC_*>LANG
    可以這么說,LC_ALL是最上級設定或者強制設定,而LANG是默認設定值。
    1、如果你設定了LC_ALL=zh_CN.UTF-8,那么不管LC_*和LANG設定成什么值,它們都會被強制服從LC_ALL的設定,成為 zh_CN.UTF-8。
    2、假如你設定了LANG=zh_CN.UTF-8,而其他的LC_*=en_US.UTF-8,并且沒有設定LC_ALL的話,那么系統的locale設定以LC_*=en_US.UTF-8。
    3、假如你設定了LANG=zh_CN.UTF-8,而其他的LC_*,和LC_ALL均未設定的話,系統會將LC_*設定成默認值,也就是LANG的值 zh_CN.UTF-8 。
    4、假如你設定了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是這樣設定的:
    1、如果你需要一個純中文的系統的話,設定LC_ALL= zh_CN.XXXX,或者LANG= zh_CN.XXXX都可以,當然你可以兩個都設定,但正如上面所講,LC_ALL的值將覆蓋所有其他的locale設定,不要作無用功。
    2、如果你只想要一個可以輸入中文的環境,而保持菜單、標題,系統信息等等為英文界面,那么只需要設定LC_CTYPE=zh_CN.XXXX,LANG=en_US.XXXX就可以了。這樣LC_CTYPE=zh_CN.XXXX,而LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=en_US.XXXX。
    3、假如你高興的話,可以把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字符集)
    羅馬的地址書寫方式,美國的紙張設定……。估計沒人這么干吧。
    4、假如你什么也不做的話,也就是LC_ALL,LANG和LC_*均不指定特定值的話,系統將采用POSIX作為lcoale,也就是C locale。

    posted on 2006-08-16 10:45 GHawk 閱讀(757) 評論(0)  編輯  收藏 所屬分類: Linux 點滴

    主站蜘蛛池模板: 大地影院MV在线观看视频免费| 免费无码又爽又黄又刺激网站| 久久久久国产精品免费看| 亚洲女人被黑人巨大进入| 免费无遮挡无遮羞在线看| 亚洲成AⅤ人影院在线观看| 美女黄频免费网站| 亚洲无码视频在线| 成人妇女免费播放久久久| 亚洲国产精品无码一线岛国| 国产午夜无码精品免费看动漫 | 国产99视频精品免费视频7| 亚洲国产欧美国产综合一区 | 中文字幕av无码无卡免费| 亚洲午夜在线播放| 免费欧洲美女牲交视频| 国产97视频人人做人人爱免费| 亚洲乱码国产乱码精品精| 最近中文字幕免费完整| 91在线亚洲综合在线| 波多野结衣免费视频观看 | 免费国产黄网站在线观看可以下载| 亚洲视频在线视频| 免费人成在线视频| 一级女人18片毛片免费视频| 亚洲AV无码乱码国产麻豆穿越| 日本免费一区二区在线观看| 亚洲AV综合永久无码精品天堂| 狠狠亚洲狠狠欧洲2019| 国产成人精品免费视频大| 精品国产日韩亚洲一区在线| 九月丁香婷婷亚洲综合色| 成人免费毛片内射美女-百度| 在线观看免费亚洲| 亚洲国产人成在线观看69网站| 永久免费av无码不卡在线观看| 九九免费久久这里有精品23| 亚洲老熟女@TubeumTV| www.亚洲精品| 国产精品视频免费观看| j8又粗又长又硬又爽免费视频|