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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...