Linux的locale、LC_ALL和LANG

来源:http://www.cnblogs.com/LCcnblogs/archive/2016/12/21/6208110.html
-Advertisement-
Play Games

如果你是一個Linux新手,並且剛剛安裝了一個新的英文系統但想要設置成中文系統,肯定會接觸到上面幾個變數,在網上搜索了一系列解決方法,給一些變數賦一下值,再export一下,或者寫到配置文件裡面,然後就搞定了,但究竟為什麼要這樣做,可能還是一知半解。通過這兩天自己對網上看到的一些文章的整理和自己的試 ...


  如果你是一個Linux新手,並且剛剛安裝了一個新的英文系統但想要設置成中文系統,肯定會接觸到上面幾個變數,在網上搜索了一系列解決方法,給一些變數賦一下值,再export一下,或者寫到配置文件裡面,然後就搞定了,但究竟為什麼要這樣做,可能還是一知半解。通過這兩天自己對網上看到的一些文章的整理和自己的試驗,在這裡記錄一下自己的理解。

 

一、什麼是locale

    locale這個單詞中文翻譯成地區或者地域,其實這個單詞包含的意義要寬泛很多。Locale是根據電腦用戶所使用的語言,所在國家或者地區,以及當地的文化傳統所定義的一個軟體運行時的語言環境。

    上面這個解釋摘上網上,說得好玄乎,舉兩個簡單的例子:

    a)在“簡體中文”的環境,運行df命令,第一行顯示的是:

文件系統               1K-塊        已用     可用 已用% 掛載點

        而在“繁體中文”的環境下,運行df命令,第一行顯示的是:

檔案系統               1K-區段      已用     可用 已用% 掛載點

    b)在中文環境下運行date命令,顯示的是

2013年 01月 27日 星期日 15:57:01 CST

        而在英文環境下,運行date命令,顯示的是

Sun Jan 27 15:57:46 CST 2013

 

    看到上面兩個例子,我想應該比較清楚了,不同地區對一些電腦辭彙、日期顯示等方面都有各自的習慣,比如中國大陸通常使用“文件系統”,而臺灣或者香港地區則會用“檔案系統”,這顯然不是簡單的從簡體到繁體的轉換而已,所以可以想像,有一套系統在為各個地區的本地化服務。

 

    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)。

 

而這些信息的配置通常放在/usr/share/i18n/locales目錄下,讓我們打開一下zh_CN和en_US,看看裡面都定義了一些什麼東西和有一些什麼區別,對比一個比較簡單的,LC_TIME有這樣的定義

zh_CN:

day    "<U661F><U671F><U65E5>";/

         "<U661F><U671F><U4E00>";/

         "<U661F><U671F><U4E8C>";/

         "<U661F><U671F><U4E09>";/

         "<U661F><U671F><U56DB>";/

         "<U661F><U671F><U4E94>";/

         "<U661F><U671F><U516D>"

mon    "<U4E00><U6708>";"<U4E8C><U6708>";"<U4E09><U6708>";/

         "<U56DB><U6708>";"<U4E94><U6708>";"<U516D><U6708>";/

         "<U4E03><U6708>";"<U516B><U6708>";"<U4E5D><U6708>";/

         "<U5341><U6708>";"<U5341><U4E00><U6708>";"<U5341><U4E8C><U6708>"

 

en_US:

 day    "<U0053><U0075><U006E><U0064><U0061><U0079>";/

         "<U004D><U006F><U006E><U0064><U0061><U0079>";/

         "<U0054><U0075><U0065><U0073><U0064><U0061><U0079>";/

         "<U0057><U0065><U0064><U006E><U0065><U0073><U0064><U0061><U0079>";/

         "<U0054><U0068><U0075><U0072><U0073><U0064><U0061><U0079>";/

         "<U0046><U0072><U0069><U0064><U0061><U0079>";/

         "<U0053><U0061><U0074><U0075><U0072><U0064><U0061><U0079>"

mon    "<U004A><U0061><U006E><U0075><U0061><U0072><U0079>";/

         "<U0046><U0065><U0062><U0072><U0075><U0061><U0072><U0079>";/

         "<U004D><U0061><U0072><U0063><U0068>";/

         "<U0041><U0070><U0072><U0069><U006C>";/

         "<U004D><U0061><U0079>";/

         "<U004A><U0075><U006E><U0065>";/

         "<U004A><U0075><U006C><U0079>";/

         "<U0041><U0075><U0067><U0075><U0073><U0074>";/

         "<U0053><U0065><U0070><U0074><U0065><U006D><U0062><U0065><U0072>";/

         "<U004F><U0063><U0074><U006F><U0062><U0065><U0072>";/

         "<U004E><U006F><U0076><U0065><U006D><U0062><U0065><U0072>";/

         "<U0044><U0065><U0063><U0065><U006D><U0062><U0065><U0072>"

 

    有人就要問了,<UXXXX>是什麼東西,這是Unicode編碼的值。這麼一說,應該很多人馬上就看出來了,上面的“day”就是對“星期”定義,而“mon”就是對“月份”的定義。

所以上面其實是

zh_CN:

day  星期日;

        星期一;

        ...

mon  一月;二月;...

 

en_US:

day  Sunday;

        Monday;

        ...

mon  January;

         February;

         ...

    是的,這就是為什麼date命令能夠根據不同地區而顯示不同內容的原因,都是通過本地化系統配置完成的。

 

二、如何配置locale

    通過locale命令,可以看到LC_*各個變數的設置,如下:

[user~]$ 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-8"

LC_NAME="zh_CN.UTF-8"

LC_ADDRESS="zh_CN.UTF-8"

LC_TELEPHONE="zh_CN.UTF-8"

LC_MEASUREMENT="zh_CN.UTF-8"

LC_IDENTIFICATION="zh_CN.UTF-8"

LC_ALL=

 

運行date命令,我們可以看到

[user~]$date

2013年 01月 27日 星期日 17:01:46 CST

 

下麵我們設置LC_TIME變數

[user~]$LC_TIME=en_US.utf8;date

2013年 01月 27日 星期日 17:04:03 CST

 

咦,怎麼還是中文的?是的,不是BUG,你還要將LC_TIME變數export一下,這涉及進程間環境變數的設置問題,這裡不多述:

[user~]$ export LC_TIME;date

Sun Jan 27 17:04:33 CST 2013

 

我們可以看到,將LC_TIME變數設置成en_US之後,date命令的日期的顯示改變了

 

可是我們如果運行ls -al命令的話,卻看到

[user~]$ ls -al

總計 0

drwx------ 10 user users 4096 2013-01-01 16:47 .

drwx------ 10 user users 4096 2013-01-01 14:51 ..

 

這裡日期並沒有以英文的顯示習慣“Jan 1 16:47”顯示,這並不奇怪,因為ls命令很可能使用不是LC_TIME變數。

而如果我們設置LC_MESSAGES變數

[user~]$ LC_MESSAGES=en_US.utf8;export LC_MESSAGES;ls -al

total 0

drwx------ 10 user users 4096 2013-01-01 16:47 .

drwx------ 10 user users 4096 2013-01-01 14:51 ..

 

可以看到,“總計 0” 變成 “total 0” 了。

 

三、LC_ALL、LANG和LC_*的關係

    設定locale就是設定12大類的locale分類屬性,即 12個LC_*。除了這12個變數可以設定以外,為了簡便起見,還有兩個變數: LC_ALL和LANG。它們之間有一個優先順序的關係: LC_ALL>LC_*>LANG 可以這麼說,LC_ALL是最上級設定或者強制設定,而LANG是預設設定值。

    重新打開一個視窗,使得LC_ALL、LANG和LC_*都回到原來的狀態,看一下各個變數的預設值。

[user~]$ echo $LANG

zh_CN.utf8

 

[user~]$ echo $LC_ALL

 

[user~]$ echo $LC_TIME

 

    可以看到,除了LANG變數是zh_CN.utf8之外,其他的LC_*,包括LC_ALL都是空。可是,我們運行locale命令,卻看到

[user~]$ locale

LANG=zh_CN.UTF-8

LC_CTYPE="zh_CN.UTF-8"

LC_NUMERIC="zh_CN.UTF-8"

......

LC_IDENTIFICATION="zh_CN.UTF-8"

LC_ALL=

 

    每個值LC_*值都和LANG的值一樣,我們改變一下LANG的值再看一下情況

[user~]$ LANG=en_US.utf8;locale

LANG=en_US.utf8

LC_CTYPE="en_US.utf8"

LC_NUMERIC="en_US.utf8"

......

LC_IDENTIFICATION="en_US.utf8"

LC_ALL=

 

     可以看到LC_*的值隨著預設值LANG的變化而變化。而此時,運行date

[user~]$date

Sun Jan 27 17:34:40 CST 2013

 

    再設置LC_ALL的值,看一下結果

[user~]$ LC_ALL=zh_CN.utf8;export LC_ALL;date

2013年 01月 27日 星期日 17:36:24 CST

 

    可以看到,設置LC_ALL屬性之後,原來的en_US.utf8屬性已經被重置了,此時再看一下locale命令

[user~]$ locale

LANG=en_US.utf8

LC_CTYPE="zh_CN.utf8"

LC_NUMERIC="zh_CN.utf8"

......

LC_IDENTIFICATION="zh_CN.utf8"

LC_ALL=zh_CN.utf8

 

     從上面的試驗可以看到,LANGLC_*的預設值,LC_*變數可以單獨設置而可以與LANG不同。而LC_ALLLC_*的優先順序別高,設置完LC_ALL之後,會強制重置LC_*各個值,如果不將LC_ALL重新設置為空,則再無法設置LC_*的單個值 

 

   That‘s all~上面就是這兩天所得的一些總結,希望對大家有幫助。如果有解釋得不對的,歡迎拍磚~

 

轉自:http://www.niba.com/f/1314803a_6771608.html

作者:戀上呼吸的樣子

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.概要 InnoDB引擎對FULLTEXT索引的支持是MySQL5.6新引入的特性,之前只有MyISAM引擎支持FULLTEXT索引。對於FULLTEXT索引的內容可以使用MATCH()…AGAINST語法進行查詢。 為了在InnoDB驅動的表中使用FULLTEXT索引MySQL5.6引入了一些新 ...
  • 一、鎖的種類 MySQL中鎖的種類很多,有常見的表鎖和行鎖,也有新加入的Metadata Lock等等,表鎖是對一整張表加鎖,雖然可分為讀鎖和寫鎖,但畢竟是鎖住整張表,會導致併發能力下降,一般是做ddl處理時使用。 行鎖則是鎖住數據行,這種加鎖方法比較複雜,但是由於只鎖住有限的數據,對於其它數據不加 ...
  • uboot環境配置 通過配置uboot讓它在啟動過程中從tftp獲取內核和設備樹,並從在載入內核之後把通過啟動參數將"從nfs掛載根文件系統"傳入內核。這個配置主要是通過uboot內建的" +`save`"設置環境變數的方式進行配置,下麵是我採用的uboot的環境變數,下麵是我用的環境變數設置: 就 ...
  • HP伺服器 hp 360g5 centos7安裝問題 一 :啟動盤無法識別硬碟 1、進入安裝光碟,用上下鍵選擇安裝centos——Install Centos7(註意不可按Enter鍵),如圖: 2、按Tab鍵,對安裝進行額外配置,在屏幕最下方會顯示如下字樣: 3、在額外配置的命令行上添加配置: h ...
  • 首先,看看什麼是超線程概念 超線程技術就是利用特殊的硬體指令,把兩個邏輯內核模擬成兩個物理晶元,讓單個處理器都能使用線程級並行計算,進而相容多線程操作系統和軟體,減少了CPU的閑置時間,提高的CPU的運行效率。超線程技術是在一顆CPU同時執行多個程式而共同分享一顆CPU內的資源,理論上要像兩顆CPU ...
  • 中國科學技術大學:   http://mirrors.ustc.edu.cn/ (IPv4+IPv6)   http://mirrors4.ustc.edu.cn/   http://mirrors6.ustc.edu.cn/   西南大學:http://linux.swu.edu.cn/s... ...
  • 說來慚愧,玩Linux這麼久了,居然沒有玩轉vmstat這個命令,對很多指標的具體意義都有點模糊不清,花了點時間好好學習、整理一下這個命令的相關資料。因為這個命令確實比較重要,而且頻繁用到。 命令簡介: vmstat是Virtual Meomory Statistics(虛擬記憶體統計)的縮寫,可對操... ...
  • 一、概要 由於監控業務發展的較快,各種告警很多,並且告警記錄不能查詢,則需要一個平臺來解決告警展示、查詢等問題,「統一告警平臺」應運而生。以下簡稱AMC(Alert Messages Center)。 AMC提供介面調用和前臺配置,支持Rtx、簡訊、微信、郵件四種告警通道,支持模塊信息自動補全、告警 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...