----- 最近更新【2022-02-03】-----
本文目录结构预览:
- 一、简介
- 二、查看区域设置:locale
1、语法
2、常用案例
3、查看区域设置特定变量的值 - 三、修改区域设置:update-locale
1、update-locale
2、修改初始化配置文件
3、全局区域设置文件 - 四、区域设置优先级
- 五、类别(category)介绍
- 六、C 排序与字典排序
- 七、参考
一、简介
在 Unix 初期,每个人都使用 ASCII 码,因此也没有什么问题。但是,ASCII 码基于英语,而随着 Unix、Linux 以及 Internet 在世界范围的扩展,有必要设计一种新系统,从而能够处理许多语言以及大量不同的文化习俗。
多年后,开发人员开发出了一种新系统,该系统基于“区域设置(locale)”的思想,这属于 POSIX 1003.2 标准。
区域设置是特定于语言和地域的规则和数据的集合,也可以看成是一组环境变量。区域设置包括有关排序规则、日期和时间格式设置、数字和货币约定,以及字符分类的信息。例如,如果 Linux 用户选择了美国英语区域设置,那么在 Linux 中,日期消息将以格式“月-日-年”显示,而货币符号将会使用“$”表示,等。
注:
可移植操作系统接口(英语:Portable Operating System Interface,缩写为 POSIX)是 IEEE 为要在各种 UNIX 操作系统上运行软件,而定义 API 的一系列互相关联的标准的总称,其正式称呼为 IEEE Std 1003,而国际标准名称为 ISO/IEC 9945。它基本上是 Portable Operating System Interface(可移植操作系统接口)的缩写,而 X 则表明其对 Unix API 的传承。
二、查看区域设置:locale
locale 命令是 Linux 系统中多语言环境的设置接口,用来设置或查看程序运行的不同语言环境。
除 C 和 POSIX 这两个 locale 名称外,locale 的命名规则为:language[_territory[.codeset]][@modifier]
,
即:语言[_地区[.字符集编码]][@修饰]
。如:en_US.UTF-8
1、语法
locale - 查看区域设置信息。(get locale-specific information)
语法:
locale [option]
locale [option] -a
locale [option] -m
locale [option] name...
常用选项:
-
-a
,(all-locales)查看所有可用区域设置。 -
-m
,(charmaps)查看所有可用字符映射。 -
-c
,(category-name)显示有关环境变量的类别。 -
-k
,(keyword-name)显示关环境变量的键名。
注:-c
与-k
选项后面须带上某个环境变量参数或具体的键名才有意义。如,locale -k LC_CTYPE
。
2、常用案例
使用命令locale
查看系统中所有区域设置的当前值。
[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
查看系统支持哪些区域设置。
[nosee@noseecomputer /home/git]$ locale -a
C
C.UTF-8
en_US.utf8
POSIX
zh_CN.utf8
zh_SG.utf8
3、查看区域设置特定变量的值
1)如果 locale 命令后面加上 category 参数,将显示该 category 的所有值。如locale LC_CTYPE
2)如果 locale 命令后面加上 keyword 参数,将显示该 keyword 对应的值。如locale charmap
当查看某个具体参数的值时,为了让输出结果更有可读性,一般会加上-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"
三、修改区域设置:update-locale
1、update-locale
update-locale - 修改全局区域设置。(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 才能生效。
如果系统上没有
update-locale
命令,也可以使用localectl
命令来代替。
以下两个命令效果一样:
sudo update-locale LANG=C.UTF-8
sudo localectl set-locale LANG=C.UTF-8
2、修改初始化配置文件
也可以通过修改初始化文件来修改区域设置,如修改用户的.bashrc
文件或.profile
文件。
如,在初始化文件中添加如下一行:
export LANG="en_US.utf8"
只是临时修改的话只在命令行执行该命令就行。
3、全局区域设置文件
如果是 Debian 类系统,可以在/etc/default
中找到全局区域设置文件:/etc/default/locale
。
update-locale
命令修改的就是这个文件的内容。
如果是 Red Hat 类系统,则该文件位于:/etc/locale.conf
。
四、区域设置优先级
说明:
- LANGUAGE 指定个人对语言环境值的主次偏好,例如
zh_CN:en_US:en
。 - LC_ALL 不是一个环境变量,实际相当于一次性设置全部的 LC_*。默认值一般都为空。
- LC_* 可设定 locale 各种类别(category)的值,可以覆盖 LANG 的值。
- LANG 指定默认使用的 locale 值。
注:若 LANG 或 LC_ALL 被设定为
C
,那么 LANGUAGE 的值将被忽视。
优先级:LANG < LC_* < LC_ALL,优先级比 LANG 高,LC_ALL 优先级最高。
LC_ALL 优先级最高,若设置了此变量,所有 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)介绍
区域设置可以分为很多个类别(category),也就是多个环境变量。下表将列出一些常用的类别:
category | 说明 | 例 | |
---|---|---|---|
LC_ADDRESS | 地址书写方式 |
country_name="United States" country_post="USA"
|
|
LC_COLLATE | 字符集排序规则 |
collate-symb-hash-sizemb=1303 collate-codeset="UTF-8"
|
|
LC_CTYPE | 语言符号及其分类,大小写转换 |
ctype-map-names="toupper";"tolower";"totitle" charmap="UTF-8"
|
|
LC_MESSAGES | 提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等 |
yesstr="yes" nostr="no"
|
|
LC_MONETARY | 货币格式化规则 |
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 | 时间显示规则 |
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 区域设置使用 ASCII 排序序列,在这种排序序列中,大写字母位于小写字母之前:ABC...XYZabc...z。该模式称为 C 排序序列。
en_US 区域设置使用一种不同的排序序列,在排序序列中,小写字母和大写字母成对分组:aAbBcC...zZ。这种模式比较自然,因为它以字典顺序组织单词和字符。所以这一模式称为 字典排序序列。
排列顺序比较:
C 区域设置:C 排序序列 | |
---|---|
空格字符 | |
符号 | ! “ # $ % & ‘ ( ) * + , - . / |
数字 | 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 区域设置:字典排序序列 | |
---|---|
符号 | ` ^ ~ < = > | 等 |
数字 | 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 区域设置中,如果字母前面有符号,将忽略符号对排序的影响。
七、参考
- 有关更多信息,请参阅 locale , update-locale 和 localectl 手册页。
- 《Unix & Linux 大学教程》(美)Harley Hahn 著 张杰良 译,相关章节:11.2、19.11、20.7。
- 如何在Linux中更改或设置系统区域设置:https://www.howtoing.com/set-system-locales-in-linux
网友评论