----- 最近更新【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