Linux字元集和系統語言設定-LANG,locale,LC_ALL,POSIX等命令及參數詳解

來源:互聯網
上載者:User

標籤:linux   lang   locale   lc_all   

博文說明【前言】:

    本文將通過個人口吻介紹Linux字元集和系統語言設定,包括LANG,locale,LC_ALL,POSIX等命令及參數詳解的相關知識,在目前時間點【2017年6月21號】下,所掌握的技術水平有限,可能會存在不少知識理解不夠深入或全面,望大家指出問題共同交流,在後續工作及學習中如發現本文內容與實際情況有所偏差,將會完善該博文內容。


本文參考文獻引用連結:

1、http://blog.csdn.net/z4213489/article/details/7937894【好文,必看】
2、http://www.360doc.com/content/14/0103/13/10384031_342301450.shtml【各種格式區別講解的比比較詳細,必看】


本文:


一:字元集部分


字元集就是:01位元據<--到-->字元的對應關係表(也可以稱為對應關聯式資料庫,對應關係集合)


樣本:

假設這是utf8字元集對應關係:
00010101----例
10101100----如

假設這是GBK字元集對應關係:
00010101----亂

10101100----碼


講解:

我們可以很清楚的看到,相同一段資料,使用不同的字元集,會有不同的顯示結果,這就是我們亂碼現象的根源,因為不同字元集組織資料的方式不一樣


ps:瀏覽器展示網頁時,網頁內容使用字元集如果和系統字元集不一致,一般也不會發生亂碼現象(英文的windows系統能正常看中文頁面),因為瀏覽器在擷取網頁檔案時,瀏覽器會做一個判斷,識別網頁內容使用的字元集,然後使用相對應字元集去顯示頁面內容,注意,前提是你作業系統中要有這些字元集存在。

補充知識-字型:

字型:文字渲染效果,同樣的一個字,會有:宋體、黑體、仿宋、隸書、楷書、微軟雅黑等等效果,字型建立在字元集基礎之上。但每個字型庫可能不會包含某個字元集全部的字型,有些時候會顯示不完全。


總結:

語言是建立在字元集的基礎之上的,比如我們的系統使用中文語言,這就是說,有以下幾點
1、寫:我們輸入的漢字要能在電腦中能以漢字字元集的格式進行組織儲存並傳輸。
2、看:網路遠端傳輸過來的資料(位元據),我電腦收到之後,需要能展示出漢字字型(此時就要用到這個對應關係表)
總結來說,在中文環境中就是:看中文,寫中文(重點在此),傳中文。

Linux中字元集檔案存放位置: /usr/share/i18n/charmaps


二:系統語言設定-locale部分


1、什麼是locale


在Linux中,它使用locale命令來設定和顯示程式啟動並執行語言環境(也就是系統運行語言環境,應用進程是在系統的進程之上啟動並執行,應用程式的父進程是init進程)

locale的英文直譯為場所,地區,地區,但它在Linux中含義要更大,在Linux中Locale根據電腦使用者所使用的語言,所在國家或者地區,以及當地的文化傳統定義一個軟體運行時的語言環境 。

locale的主要作用是描述某一個地區內的人們的語言習慣和文化傳統和生活習慣。一個地區的locale就是根據幾大類的習慣(變數)定義的。


2、locale的命名規則


locale 命名規則:<語言>_<地區>.<字元集編碼><@修正值>
例如:
zh_CN.utf8
zh_CN.utf8,zh代表中文,CN代表大陸地區,utf8表示字元集。

[email protected]
de表示德語,DE表示德國,UTF-8表示字元集,euro表示按照歐洲習慣加以修正 

這個命令規則就是說我們在設定locale的相關變數時,都是使用這種格式給變數進行賦值



3、locale命令及參數講解


設定Locale的根本其實就是設定一組總共12個LC開頭的變數(不包括LANG和LC_ALL)

Linux中locale檔案存放位置: /usr/share/i18n/locales


樣本:

[email protected]:~/.ssh> locale
LANG=zh_CN.utf8
LC_CTYPE="zh_CN.utf8"
LC_NUMERIC="zh_CN.utf8"
LC_TIME="zh_CN.utf8"
LC_COLLATE="zh_CN.utf8"
LC_MONETARY="zh_CN.utf8"
LC_MESSAGES="zh_CN.utf8"
LC_PAPER="zh_CN.utf8"
LC_NAME="zh_CN.utf8"
LC_ADDRESS="zh_CN.utf8"
LC_TELEPHONE="zh_CN.utf8"
LC_MEASUREMENT="zh_CN.utf8"
LC_IDENTIFICATION="zh_CN.utf8"
LC_ALL=


講解:


LANG                         #LANG的優先順序是最低的,它是所有LC_*變數的預設值。下方所有以LC_開頭變數(不包括LC_ALL)中,如果存在沒有設定變數值的變數,那麼系統將會使用LANG的變數值來給這個變數進行賦值。如果變數有值,則保持不變,不受影響。可以看到,我們上面樣本中的輸出中的LC_*變數的值其實就是LANG變數決定的

LC_CTYPE                   #用於字元分類和字串處理,控制所有字元的處理方式,包括字元編碼,字元是單位元組還是多位元組,如何列印等,這個變數是最重要的。
LC_NUMERIC              #用于格式化非貨幣的數字顯示。
LC_TIME                      #用于格式化時間和日期。
LC_COLLATE                #用於比較和排序。
LC_MONETORY           #用于格式化貨幣單位。
LC_MESSAGES             #用於控製程序輸出時所使用的語言,主要是提示資訊,錯誤資訊,狀態資訊, 標題,標籤, 按鈕和菜單等。
LC_PAPER                     #預設紙張尺寸大小
LC_NAME                     #姓名書寫方式
LC_ADDRESS                #地址書寫方式
LC_TELEPHONE            #電話號碼書寫方式
LC_MEASUREMENT     #度量衡表達方式
LC_IDENTIFICATION    #locale對自身包含資訊的概述

LC_ALL                         #它不是環境變數,它是一個宏,可通過該變數的設定覆蓋所有的LC_*變數。這個變數設定之後,可以廢除LC_*的設定值,使得這些變數的設定值與LC_ALL的值一致,注意,LANG變數不受影響。

宏:可能會有人對宏沒概念,簡單說明下,我們在電腦領域說的宏(Macro),是批量處理的一個說法。宏是一種通過某種指定規則來處理資料的過程,可以稱之為文法替換(大家應該在編輯器裡匹配替換過資料,但這這裡要複雜點),這裡不同資料替換,宏是擷取某種輸入(通常是字串),然後如何根據事先定義的規則,轉換成對應的輸出(通常也是字串)。真實的宏要比這裡說的複雜,有興趣可以自行查資料。
在這裡,我們這個宏操作就是用LC_ALL的值去覆蓋LC_*的變數值

格式化:上面的含義講到格式化,可能會有人不太清楚,格式化就是重新設定組織資料的規則,拿我們日常生活舉例子,我們要記錄一段資料,我們可以記在方格紙上,可以記在橫格紙上,可以記在白紙上等等,這裡的這種的紙張格式就是組織資料的一種方式,不同格式,記錄方式和資料量等都不一樣,我們在Windows系統中,經常做的格式化優盤操作就是這樣,可以把內建的FAT32格式,重新格式化定義為NTFS格式,你可以理解為,將優盤的記錄資料從方格紙方式變成橫格紙方式。

優先順序層級:LC_ALL>LC_*>LANG

注意:定義這麼多變數在某些情況下是很有用的,例如,當我需要一個能夠輸入中文的英文環境,我可以把 LC_CTYPE設定成zh_CN.GB18030,而其他所有的項都是en_US.UTF-8。 

總結:LANG是LC_*的預設值,而LC_ALL比LC_*的優先順序都高,設定完LC_ALL之後,會強制重設LC_*的值,如果不將LC_ALL的值重設為空白,則無法再去設定LC_*的值

補充:一般來說,我們在新裝系統之後,我們的變數的值將會是下面這種情況:
NTP-slave:~ # locale
LANG=POSIX
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

講解:C是系統預設的locale,而POSIX是C的別名,這是標準的C Locale。它所指定的屬性和行為由ISO C標準所指定。當我們新安裝完一個系統時,預設的locale就是C或POSIX。
我們這裡說的C其實就是ASCII編碼。

POSIX:可移植作業系統介面(Portable Operating System Interface of UNIX,縮寫為 POSIX ),POSIX標準定義了作業系統應該為應用程式提供的介面標準,是IEEE為要在各種UNIX作業系統上啟動並執行軟體而定義的一系列API標準的總稱,其正式稱呼為IEEE 1003,而國際標準名稱為ISO/IEC 9945。
換句話說,為一個POSIX相容的作業系統編寫的程式,可以在任何其它的POSIX作業系統(即使是來自另一個廠商)上編譯執行。
總結:POSIX是一種類UNIX系統的通用介面標準,基於這個標準開發的程式,能夠靈活的遷移到不同版本系統上使用。

在這裡,locale中的POSIX說的就是一種業內統一的預設locale標準,不區分地區,所有Linux發行版本都支援。


4、常用命令:

1、查看當前locale設定
# locale

NTP-slave:~ # locale
LANG=zh_CN.utf8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="zh_CN.utf8"
LC_TIME="zh_CN.utf8"
LC_COLLATE="zh_CN.utf8"
LC_MONETARY="zh_CN.utf8"
LC_MESSAGES="zh_CN.utf8"
LC_PAPER="zh_CN.utf8"
LC_NAME="zh_CN.utf8"
LC_ADDRESS="zh_CN.utf8"
LC_TELEPHONE="zh_CN.utf8"
LC_MEASUREMENT="zh_CN.utf8"
LC_IDENTIFICATION="zh_CN.utf8"
LC_ALL=

2、查看當前系統的所有可用locale
# locale -a

3、設定系統的locale(此處以zh_CN.utf8為例)

1)編輯檔案:/etc/profie,在檔案末尾添加以下內容並報錯退出
#vim /etc/profile
export LC_ALL=zh_CN.utf8
export LANG=zh_CN.utf8
2)執行生效命令:
#source /etc/profile



結尾:


     感謝閱讀,祝有收穫的一天,謝謝!





本文出自 “清風攬月的部落格” 部落格,請務必保留此出處http://watchmen.blog.51cto.com/6091957/1940609

Linux字元集和系統語言設定-LANG,locale,LC_ALL,POSIX等命令及參數詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.