??????? 最近学到linux语言、字符集等环境配置,感觉这个地方不好理解,所以花了2天之间查了各种网上查了资料,再在自己的系统(rhel8)上验证了以后,写下了这个文章。希望对大家有用。有不足支持还望批评指正。谢谢。
一、关于locale,以下列举几种介绍
locale描述1:
????????程序运行使用一套语言需要有字符集(数据)和字体(显示),locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。
locale描述2:
????????locale是 Linux 系统中多语言环境的接口,每个locale都定义了地区、语言和字符集。locale的语法规则是:<语言>_<地区>.<字符集编码><@修正值>,如 zh_CN.UTF-8中,zh表示中文,CN表示中国大陆,UTF-8 表示字符集。
locale描述3:
????????locale 是 Linux 系统中多语言环境的接口,每个 locale 都定义了地区、语言和字符集。locale 的语法规则是:<语言>_<地区>.<字符集编码><@修正值>,如 zh_CN.UTF-8 中,zh 表示中文,CN 表示中国大陆,UTF-8 表示字符集。
locale描述4:
????????locale的值会影响以下方面:(1)大量的程序界面语言的本地化.(2)修正字符在字母、数字和其它类的分类。对于非英语区域设置来说,只有这样,bash才能正常显示非ASCII字符。(3)国家顺序可以按照字母顺序正常排序(译者注:这里所谓的正常排序,应该是首先将国家名称转换成本地语言的国家名称,比如中国的开头字母是Z,那么显示就很靠后了。但是假如显示为英文,就是C开头,那么将会靠前显示。)(4)默认纸张尺寸(5)货币、时间和日期值的格式。
locale描述5:
????????locale 是 Linux 系统中多语言环境的设置接口,在 Linux 中,使用 locale 命令来设置和显示程序运行的语言环境,locale 会根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统定义一个软件运行时的语言环境。locale 由ANSI C提供支持。
二、查看当前 locale(语言环境/字符集)
????????操作系统根据区域不同以及人们对于计算机的输入习惯,将 locale(语言环境/字符集)归纳为12大类,并且分别赋予了12个环境变量,即12个LC_*。
变量 ???????? 含义
LC_CTYPE: ??? ? 语言符号及其分类
LC_NUMERIC: 数字
LC_TIME: ???? 时间显示格式
LC_COLLATE: ??? 比较和排序习惯
LC_MONETARY: 货币单位
LC_MESSAGES: 信息,如提示信息、错误信息、状态信息、标题、标签、按钮和菜单等
LC_PAPER: ???? 默认纸张大小
LC_NAME: ???? 姓名书写方式
LC_ADDRESS: 地址书写方式
LC_TELEPHONE: 电话号码书写方式
LC_MEASUREMENT: 度量衡表达方式
LC_IDENTIFICATION: locale 对自身包含信息的概述
我们通过locale命令可以查看当前的语言环境(字符集)的环境变量:
$ locale
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN:zh
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
????????从输出结果发现,除了上面提到的12个LC_*以外,还有3个变量,分别是LC_ALL、LANG和LANGUAGE。
????????这里需要分别说明,其中的2个变量:LC_ALL、LANG与当前locale有关。而且,它们之间有一个优先级的关系:LC_ALL > LC_* > LANG。
????当设置了 LC_ALL 的值,则 LC_* 和 LANG 的值将会强制转换为 LC_ALL 的值
????当设置了 LANG 的值,如果 LC_* 有值,则 locale 采用该值(LC_* > LANG);而没有赋值的 LC_* ,则locale会采用LANG 的值。
????如果 LC_ALL、LANG和LC_*都不设置的话,系统将采用POSIX作为lcoale,也就是”C” locale。
注:
(1)“POSIX”是“C”的别名,如果LC_*或者LC_ALL的值设置为“C”或者“POSIX”表明使用(POSIX的)默认值。
(2)当我们新安装完一个系统时,默认的locale就是C或POSIX。
三、locale常用操作
1、查看现有语言环境:
(1)执行locale命令
(2)通过配置文件查看当前配置cat /etc/locale.conf。
2、可用语言环境(打印所有可用的语言环境):
locale -a
3、临时修改语言环境(只在当前shell下有用):
export LANG=en_US.UTF-8
export LANG=zh_CN.UTF-8
4、查看locale设置过程中的字符集标注名称
字符映射表可能存在很多的别名,比如 “ISO-8859-1” 可以写作 “iso8859-1” 或 “iso88591”。但是有一些程序不支持这些乱七八糟的写法(比如 UTF-8 只能写作 UTF-8,utf8 它就不认识了)。所以,为了安全起见,在设置的时候还是尽量的使用特定区域设置的规范名称。可以通过以下命令,查询在特定区域下的 字符映射表标准名称,为运行locale -a输出的首选区域设置(这里以 zh_CN.utf8为例)。
执行:LC_ALL=zh_CN.utf8 locale charmap,然后会输出UTF-8。
例1:
对于 “zh_CN.utf8” 以上命令将会如下输出:
[root@localhost locales]# LC_ALL=en_US.iso88591 locale charmapISO-8859-1
例2:
[root@localhost locales]# LC_ALL=zh_CN.utf8 locale charmapUTF-8
根据以上输出,我们再次修改 /etc/locale.conf, 将字符映射表设置为标准形式(zh_CN.utf8 变为 zh_CN.UTF-8)。
5.如何修改locale
????????关于这个问题,我今天在网上查找了一天资料,把每个方法都亲身实践以后,发现能在我自己系统(rhel8)上生效的方法并不多,我自己只掌握了2个方法,如下:
(1)图形环境下改变”区域和语言”中的区域或者语言,会改变系统的区域、语言和字符集环境。本文后面有详细实验结论。
(2)在配置文件(比如/etc/profile或者~/.bashrc文件中)中改变LANG、LC_ALL、LC_*的值。
注意:网上搜索到的下面几个方法对rhel8全部无效:
方法1.可以修改/etc/profile文件
修改/etc/profile文件,在最下面增加
export LC_ALL=zh_CN.utf8
export LANG=zh_CN.utf8
命令行中使用命令 source 下配置文件,使其生效
方法2:修改/etc/locale.gen文件
将注释打开即可,修改完成后,执行下 locale-gen 命令使其生效
#en_SG ISO-8859-1
en_US.UTF-8 UTF-8
#en_US ISO-8859-1
方法3.localectl 命令行模式
localectl set-locale LANG=en_US.UTF-8
方法3:修改/etc/default/locale
注销一下,使其生效
LANG=“en_US.UTF-8”
LANGUAGE=“en_US:en”
方法4:创建/etc/locale.conf文件
LANG=en_AU.UTF-8
LC_COLLATE=C
LC_TIME=en_DK.UTF-8
source 使其生效
这4个方法对于我的rhel8完全无效。
四、问题
1.网上有帖子通过vim直接修改文件/etc/locale.conf或者用命令localectl set-locale命令修改/etc/locale.conf文件中的LANG和LC_CTYPE环境变量,我试了下,重启系统后会打不开终端。紧急修改LANG环境变量是没问题的(不能同时修改LC_CTYPE)。
2.自己通过修改/etc/locale.conf(命令修改或者直接vim修改),重启后系统不会影响系统以及LANG的值。
五、实验
1.实验1:
目的:(1)为了用/etc/profile设置locale(2)为了验证环境变量的特点——设置了环境变量的之后,仅仅在当前shell和子shell中有用。
步骤1:在/etc/profile中添加以下语句:
export LC_ALL=”zh_CN.UTF-8”
步骤2:source /etc/profile
步骤3:
[r@localhost ~]$ echo $LANG
en_US.UTF-8
[r@localhost ~]$ locale
LANG=en_US.UTF-8
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=
[r@localhost ~]$
说明:因为自己没有获得/etc/profile,所以即使自己修改了/etc/profile,也不会对系统有什么实时影响。
步骤4:用户r执行source /etc/profile之后,再查询locale和环境变量LANG
[r@localhost ~]$ source /etc/profile [r@localhost ~]$ echo $LANG en_US.UTF-8 [r@localhost ~]$ locale LANG=en_US.UTF-8 LC_CTYPE="zh_CN.UTF-8" LC_NUMERIC="zh_CN.UTF-8" LC_TIME="zh_CN.UTF-8" LC_COLLATE="zh_CN.UTF-8" LC_MONETARY="zh_CN.UTF-8" LC_MESSAGES="zh_CN.UTF-8" LC_PAPER="zh_CN.UTF-8" LC_NAME="zh_CN.UTF-8" LC_ADDRESS="zh_CN.UTF-8" LC_TELEPHONE="zh_CN.UTF-8" LC_MEASUREMENT="zh_CN.UTF-8" LC_IDENTIFICATION="zh_CN.UTF-8" LC_ALL=zh_CN.UTF-8
????????说明:因为自己没有改变环境变量LANG的值,所以LANG的值不变。但是因为自己改变了LC_ALL的值(而且重新激活了/etc/profile),所有locale被改变了,即所有的LC_*都改成了LC_ALL的值(LANG没变)。
????????如果想要改变LANG的值,可以单独在/etc/profile末尾加上一句export LANG=”zh_CN.UTF-8”。说明改变LC_ALL不能改变过LANG的值,LANG的值需要其他方法去改变。在文本后面中介绍如何改变LANG。
实验2:
step1:执行locale,发现LC_*的值都是”en_US.UTF-8”。执行echo $LANG,结果是en_US.UTF-8.
step2:在图形环境中依次点击”设置”->“detail”->”time zone”中把时区设置成”Central African republic”,然后reboot。然后发现根本不会改变locale和LANG的值。
step3:在图形环境中依次点击“设置”->“region & language”,然后把语言下面的格式改成(语言不变,只改格式format)中国,结果重启发现,locale改变了一部分(部分LC_*改成了“zh_CN.UTF-8”,还有部分LC_*依旧是en_US.UTF-8), LANG值不变。
step4:该那边在图形环境中依次点击“设置”->“region & language”,然后把语言改成“汉语”,然后重启后发现,LANG的值改成了”zh_CN.UTF-8”,locale的值step3没改变的那部分全部改成了“zh_CN.UTF-8”。
有以上实验操作,可以得出如下结论:
1.图形环境下改变linux的time zone(时区),不会对系统环境造成任何影响。
2.图形环境下改变”region & language”即”区域和语言”,会造成locale或者LANG的改变,具体如下:
(1)如果改变”region & language”中的 language,那么重启后会改变LANG的值,即LANG的值发生了相应的改变,locale中的部分LC_*的值也发生了变化。
(2)如果改变”region&lang”中的region,那么重启后发现locale中的部分LC_*发生了部分改变。
继续总结结论:
??????? 图形环境下改变”region & language”中的language会改变LANG的值,和locale中的部分LC_*的值。
????????图形化境下改变”region &language”中的region会改变locale中的部分LC_*的值。
五、补充
1.关于LANG环境变量,LANG不是依靠LC_ALL以及/etc/locale.conf改变而改变的。LANG的改变我自己发现有2个方法:
方法1:在GUI环境下,点击“系统的设置”,然后在“区域-语言”中改变“语言”,重启电脑就可以改变本用户的LANG.
方法2:直接在配置文件中改变LANG的值。例如:/etc/profile或者~/.bashrc中改变LANG的值。重启机器后都会对该用户生效。/etc/profile(全局环境变量配置文件)改变后,对每个用户都生效,~/.bashrc中改变后,只对当前用户生效。注意,如果不重启电脑,而用source或者.去获得文件,仅仅只对当前shell或者子shell中生效。