1. 程式人生 > >Linux字符集和系統語言設置-LANG,locale,LC_ALL,POSIX等命令及參數詳解

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

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等命令及參數詳解