linux基本系统配置 - 系统语言、区域和字符集设置详细(rhel8)

发布时间:2024年01月03日

??????? 最近学到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 charmap

ISO-8859-1

例2:
[root@localhost locales]# LC_ALL=zh_CN.utf8 locale charmap

UTF-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中生效。

文章来源:https://blog.csdn.net/digitalkee/article/details/135370626
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。