Linux深入探索16-區(qū)域設置:locale

----- 最近更新【2022-02-03】-----

本文目錄結構預覽:

  • 一蚌铜、簡介
  • 二嫩海、查看區(qū)域設置:locale
    1叁怪、語法
    2、常用案例
    3耳璧、查看區(qū)域設置特定變量的值
  • 三展箱、修改區(qū)域設置:update-locale
    1混驰、update-locale
    2、修改初始化配置文件
    3昆汹、全局區(qū)域設置文件
  • 四婴栽、區(qū)域設置優(yōu)先級
  • 五、類別(category)介紹
  • 六映皆、C 排序與字典排序
  • 七捅彻、參考

一鞍陨、簡介

在 Unix 初期,每個人都使用 ASCII 碼缭裆,因此也沒有什么問題寿烟。但是韧衣,ASCII 碼基于英語,而隨著 Unix氏淑、Linux 以及 Internet 在世界范圍的擴展硕噩,有必要設計一種新系統(tǒng)炉擅,從而能夠處理許多語言以及大量不同的文化習俗。

多年后眶俩,開發(fā)人員開發(fā)出了一種新系統(tǒng)快鱼,該系統(tǒng)基于“區(qū)域設置(locale)”的思想,這屬于 POSIX 1003.2 標準线罕。

區(qū)域設置是特定于語言和地域的規(guī)則和數(shù)據(jù)的集合钞楼,也可以看成是一組環(huán)境變量询件。區(qū)域設置包括有關排序規(guī)則、日期和時間格式設置座咆、數(shù)字和貨幣約定,以及字符分類的信息。例如箕戳,如果 Linux 用戶選擇了美國英語區(qū)域設置,那么在 Linux 中澳厢,日期消息將以格式“月-日-年”顯示,而貨幣符號將會使用“$”表示,等办素。

注:
可移植操作系統(tǒng)接口(英語:Portable Operating System Interface粱哼,縮寫為 POSIX)是 IEEE 為要在各種 UNIX 操作系統(tǒng)上運行軟件胯舷,而定義 API 的一系列互相關聯(lián)的標準的總稱,其正式稱呼為 IEEE Std 1003,而國際標準名稱為 ISO/IEC 9945充甚。它基本上是 Portable Operating System Interface(可移植操作系統(tǒng)接口)的縮寫,而 X 則表明其對 Unix API 的傳承技矮。

二、查看區(qū)域設置:locale

locale 命令是 Linux 系統(tǒng)中多語言環(huán)境的設置接口,用來設置或查看程序運行的不同語言環(huán)境十性。
除 C 和 POSIX 這兩個 locale 名稱外,locale 的命名規(guī)則為:language[_territory[.codeset]][@modifier]烹植,
即:語言[_地區(qū)[.字符集編碼]][@修飾]草雕。如:en_US.UTF-8

1、語法

locale - 查看區(qū)域設置信息诫钓。(get locale-specific information)

語法:

locale [option]
locale [option] -a
locale [option] -m
locale [option] name...

常用選項:

  • -a,(all-locales)查看所有可用區(qū)域設置。
  • -m,(charmaps)查看所有可用字符映射驰唬。
  • -c,(category-name)顯示有關環(huán)境變量的類別。
  • -k杯拐,(keyword-name)顯示關環(huán)境變量的鍵名。

注:-c-k選項后面須帶上某個環(huán)境變量參數(shù)或具體的鍵名才有意義余掖。如,locale -k LC_CTYPE魔种。

2、常用案例

使用命令locale查看系統(tǒng)中所有區(qū)域設置的當前值准谚。

[nosee@noseecomputer /home/git]$ locale 
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

使用命令locale -a查看系統(tǒng)支持哪些區(qū)域設置。

[nosee@noseecomputer /home/git]$ locale -a
C
C.UTF-8
en_US.utf8
POSIX
zh_CN.utf8
zh_SG.utf8

3、查看區(qū)域設置特定變量的值

1)如果 locale 命令后面加上 category 參數(shù)艾岂,將顯示該 category 的所有值。如locale LC_CTYPE
2)如果 locale 命令后面加上 keyword 參數(shù),將顯示該 keyword 對應的值几蜻。如locale charmap

當查看某個具體參數(shù)的值時,為了讓輸出結果更有可讀性,一般會加上-kc選項源武。

例:

[nosee@noseecomputer ~]$ locale -k LC_NAME
name_fmt="%d%t%g%t%m%t%f"
name_gen=""
name_mr="Mr."
name_mrs="Mrs."
name_miss="Miss."
name_ms="Ms."
name-codeset="UTF-8"
[nosee@noseecomputer ~]$ locale charmap
UTF-8
[nosee@noseecomputer ~]$ locale -c charmap
LC_CTYPE
UTF-8
[nosee@noseecomputer ~]$ locale -ck charmap
LC_CTYPE
charmap="UTF-8"
[nosee@noseecomputer ~]$ locale -ck charmap d_t_fmt
LC_CTYPE
charmap="UTF-8"
LC_TIME
d_t_fmt="%a %d %b %Y %r %Z"

例:查看有關存儲時間和日期的格式。

[nosee@noseecomputer ~]$ locale -k LC_TIME
abday="Sun;Mon;Tue;Wed;Thu;Fri;Sat"
day="Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday"
abmon="Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec"
mon="January;February;March;April;May;June;July;August;September;October;November;December"
am_pm="AM;PM"
d_t_fmt="%a %d %b %Y %r %Z"
d_fmt="%m/%d/%Y"
t_fmt="%r"
t_fmt_ampm="%I:%M:%S %p"
...(省略)
week-ndays=7
week-1stday=19971130
week-1stweek=1
first_weekday=1
first_workday=2
cal_direction=1
timezone=""
date_fmt="%a %d %b %Y %r %Z"
time-codeset="UTF-8"
alt_mon="January;February;March;April;May;June;July;August;September;October;November;December"
ab_alt_mon="Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec"

三、修改區(qū)域設置:update-locale

1、update-locale

update-locale - 修改全局區(qū)域設置。(Modify global locale settings)

語法:update-locale [OPTIONS] [var=locale | var] [...]

例:將 LANG 設置為 C.UTF-8

[nosee@noseecomputer ~]$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
[nosee@noseecomputer ~]$ sudo update-locale  LANG=C.UTF-8
[nosee@noseecomputer ~]$ locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=

設置完需要重啟 shell 才能生效。

如果系統(tǒng)上沒有update-locale命令,也可以使用localectl命令來代替恰梢。
以下兩個命令效果一樣:
sudo update-locale LANG=C.UTF-8
sudo localectl set-locale LANG=C.UTF-8

2、修改初始化配置文件

也可以通過修改初始化文件來修改區(qū)域設置,如修改用戶的.bashrc文件或.profile文件。

如丸氛,在初始化文件中添加如下一行:

export LANG="en_US.utf8"

只是臨時修改的話只在命令行執(zhí)行該命令就行。

3私股、全局區(qū)域設置文件

如果是 Debian 類系統(tǒng),可以在/etc/default中找到全局區(qū)域設置文件:/etc/default/locale峭状。
update-locale命令修改的就是這個文件的內(nèi)容。

如果是 Red Hat 類系統(tǒng)羔巢,則該文件位于:/etc/locale.conf稿壁。

四、區(qū)域設置優(yōu)先級

說明:

  • LANGUAGE 指定個人對語言環(huán)境值的主次偏好喧笔,例如zh_CN:en_US:en
  • LC_ALL 不是一個環(huán)境變量,實際相當于一次性設置全部的 LC_*牌借。默認值一般都為空。
  • LC_* 可設定 locale 各種類別(category)的值院领,可以覆蓋 LANG 的值。
  • LANG 指定默認使用的 locale 值。

注:若 LANG 或 LC_ALL 被設定為C,那么 LANGUAGE 的值將被忽視。

優(yōu)先級:LANG < LC_* < LC_ALL置媳,優(yōu)先級比 LANG 高,LC_ALL 優(yōu)先級最高。

LC_ALL 優(yōu)先級最高,若設置了此變量膘掰,所有 LC_* 和 LANG 都會強制跟隨它的值苍日,所以一般不用辜纲。 LC_ALL 實際相當于一次設置全部的 LC_* 耕腾。

一般我們使用 LANG 來設置全部的 LC_*,而獨立設置一個 LC_* 為想要的設置。比如冈欢,我設置LANG=en_US.UTF-8臼勉,設置LC_TIME=zh_GN.UTF-8岸裙,目的是為了輸出中文形式的時間恩闻。如下:

[17:32 @nosee ~/Desktop]$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_US.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=
[17:37 @nosee ~/Desktop]$ date
Wed 02 Feb 2022 05:37:05 PM CST
[17:37 @nosee ~/Desktop]$ export LC_TIME=zh_CN.UTF-8
[17:39 @nosee ~/Desktop]$ date
2022年 02月 02日 星期三 17:39:46 CST

五幢尚、類別(category)介紹

區(qū)域設置可以分為很多個類別(category)尉剩,也就是多個環(huán)境變量。下表將列出一些常用的類別:

category 說明
LC_ADDRESS 地址書寫方式 country_name="United States"
country_post="USA"
LC_COLLATE 字符集排序規(guī)則 collate-symb-hash-sizemb=1303
collate-codeset="UTF-8"
LC_CTYPE 語言符號及其分類,大小寫轉(zhuǎn)換 ctype-map-names="toupper";"tolower";"totitle"
charmap="UTF-8"
LC_MESSAGES 提示信息,錯誤信息, 狀態(tài)信息,
標題, 標簽, 按鈕和菜單等
yesstr="yes"
nostr="no"
LC_MONETARY 貨幣格式化規(guī)則 int_curr_symbol="USD "
currency_symbol="$"
LC_NAME 姓名書寫方式 name_mr="Mr."
name_miss="Miss."
LC_PAPER 默認紙張尺寸大小 height=279
width=216
LC_TELEPHONE 電話號碼書寫方式 tel_int_fmt="+%c (%a) %l"
int_select="11"
LC_TIME 時間顯示規(guī)則 abday="日;一;二;三;四;五;六"
d_t_fmt="%Y年%m月%d日 %A %H時%M分%S秒"

使用命locale可心展開查看每個 category 的具體鍵值對:

[18:16 @nosee ~/Desktop]$ locale -kc LC_TIME
LC_TIME
abday="日;一;二;三;四;五;六"
day="星期日;星期一;星期二;星期三;星期四;星期五;星期六"
abmon="1月;2月;3月;4月;5月;6月;7月;8月;9月;10月;11月;12月"
mon="一月;二月;三月;四月;五月;六月;七月;八月;九月;十月;十一月;十二月"
am_pm="上午;下午"
d_t_fmt="%Y年%m月%d日 %A %H時%M分%S秒"
d_fmt="%Y年%m月%d日"
t_fmt="%H時%M分%S秒"
t_fmt_ampm="%p %I時%M分%S秒"
...
date_fmt="%Y年 %m月 %d日 %A %H:%M:%S %Z"
time-codeset="UTF-8"
alt_mon="一月;二月;三月;四月;五月;六月;七月;八月;九月;十月;十一月;十二月"
ab_alt_mon="1月;2月;3月;4月;5月;6月;7月;8月;9月;10月;11月;12月"

或者查看某個具體的值:

[18:23 @nosee ~/Desktop]$ locale -kc abday
LC_TIME
abday="日;一;二;三;四;五;六"

六础倍、C 排序與字典排序

C 區(qū)域設置使用 ASCII 排序序列忆家,在這種排序序列中弦赖,大寫字母位于小寫字母之前:ABC...XYZabc...z蹬竖。該模式稱為 C 排序序列币厕。

en_US 區(qū)域設置使用一種不同的排序序列旦装,在排序序列中摊滔,小寫字母和大寫字母成對分組:aAbBcC...zZ阴绢。這種模式比較自然,因為它以字典順序組織單詞和字符艰躺。所以這一模式稱為 字典排序序列呻袭。

排列順序比較:

C 區(qū)域設置:C 排序序列
空格字符
符號 ! “ # $ % & ‘ ( ) * + , - . /
數(shù)字 0 1 2 3 4 5 6 7 8 9
大寫字母 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
更多符號 [ \ ] ^ _ `
小寫字母 a b c d e f g h i j k l m n o p q u v w x y z
更多符號 { | } ~
en_US 區(qū)域設置:字典排序序列
符號 ` ^ ~ < = > | 等
數(shù)字 0 1 2 3 4 5 6 7 8 9
字母 a A b B c C d D e E f F g G h H i I j J k K l L m M n N
o O p P q Q r R s S t T u U v V w W x X y Y z Z

例:C 排序序列

[nosee@noseecomputer ~]$ cat aaa 
aaaa
AAAAAAAAAAA
bbbbbbbbbbb
CCCCCCCCCCC
[]
 dd
.ff
FF
[nosee@noseecomputer ~]$ sort aaa 
 dd
.ff
AAAAAAAAAAA
CCCCCCCCCCC
FF
[]
aaaa
bbbbbbbbbbb

例:字典排序序列

[nosee@noseecomputer ~]$ export LC_COLLATE=en_US.UTF-8
[nosee@noseecomputer ~]$ sort aaa 
[]
aaaa
AAAAAAAAAAA
bbbbbbbbbbb
CCCCCCCCCCC
 dd
.ff
FF

注:
在 en_US 區(qū)域設置中,如果字母前面有符號腺兴,將忽略符號對排序的影響左电。

七、參考

  • 有關更多信息页响,請參閱 locale 篓足, update-locale 和 localectl 手冊頁。
  • 《Unix & Linux 大學教程》(美)Harley Hahn 著 張杰良 譯栈拖,相關章節(jié):11.2、19.11参滴、20.7青灼。
  • 如何在Linux中更改或設置系統(tǒng)區(qū)域設置:https://www.howtoing.com/set-system-locales-in-linux
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末檀夹,一起剝皮案震驚了整個濱河市丽已,隨后出現(xiàn)的幾起案子嘁灯,更是在濱河造成了極大的恐慌孽糖,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門滑沧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人殖属,你說我怎么就攤上這事挠唆《矶铮” “怎么了踪蹬?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵布疙,是天一觀的道長儒溉。 經(jīng)常有香客問我涛碑,道長揉阎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任搀突,我火速辦了婚禮徐许,結果婚禮上恰起,老公的妹妹穿的比我還像新娘哄芜。我一直安慰自己,他們只是感情好蕊温,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布凉翻。 她就那樣靜靜地躺著制轰,像睡著了一般男杈。 火紅的嫁衣襯著肌膚如雪肤无。 梳的紋絲不亂的頭發(fā)上皇忿,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天盼忌,我揣著相機與錄音,去河邊找鬼跨嘉。 笑死川慌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梦重,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼兑燥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忍饰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤寺庄,失蹤者是張志新(化名)和其女友劉穎艾蓝,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斗塘,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡赢织,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了馍盟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片于置。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贞岭,靈堂內(nèi)的尸體忽然破棺而出八毯,到底是詐尸還是另有隱情,我是刑警寧澤瞄桨,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布话速,位于F島的核電站,受9級特大地震影響芯侥,放射性物質(zhì)發(fā)生泄漏泊交。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一柱查、第九天 我趴在偏房一處隱蔽的房頂上張望廓俭。 院中可真熱鬧,春花似錦唉工、人聲如沸研乒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽告嘲。三九已至,卻和暖如春奖地,著一層夾襖步出監(jiān)牢的瞬間橄唬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工参歹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仰楚,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像僧界,于是被迫代替她去往敵國和親侨嘀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容