文章目录
Ubuntu/Linux 配置 locale
1 概述
在 Linux 系统中,locale 是一个非常重要的概念,它定义了系统显示语言、字符编码、日期时间格式等本地化设置。这些设置对于确保软件以用户期望的方式显示信息至关重要,特别是在多语言环境中。
2 locale
2.1 locale 规则
命令规则
locale
的命名规则一般为 <语言>_<地区>.<字符集编码>
,例如 zh_CN.UTF-8
。其中:
<语言>
:代表所使用的语言,如zh
代表中文,en
代表英文。<地区>
:代表所在的国家或地区,如CN
代表中国大陆,US
代表美国。<字符集编码>
:表示字符的编码方式,如UTF-8
是一种广泛使用的字符编码,支持多种语言的字符。
环境变量
在 Linux 中,通过一系列以 LC_
开头的环境变量来控制不同方面的本地化设置。这些环境变量包括但不限于:
LANG
:所有LC_*
环境变量的默认值,优先级最低。如果没有为某个LC_*
变量指定值,则使用LANG
的值。LC_CTYPE
:用于字符分类和字符串处理,控制字符的编码、字符是单字节还是多字节等。LC_NUMERIC
:用于格式化非货币的数字显示。LC_TIME
:用于格式化时间和日期。LC_COLLATE
:用于比较和排序字符串。LC_MONETARY
:用于格式化货币单位。LC_MESSAGES
:用于控制程序输出时所使用的语言,主要是提示信息、错误信息、状态信息等。LC_ALL
:一个特殊的变量,用于覆盖所有LC_*
变量的设置。如果设置了LC_ALL
,则所有LC_*
变量的设置都将被忽略,转而使用LC_ALL
的值。注意,LANG
变量不受LC_ALL
的影响。
优先级
环境变量的优先级从高到低为:LC_ALL
> LC_*
(除了 LC_ALL
)> LANG
。
2.2 查看当前 locale 设置
使用 locale
指令列出当前的 locale 设置。
$ locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
这个命令会列出所有 locale 相关的环境变量及其当前值,比如 LANG
、LC_CTYPE
、LC_NUMERIC
等。其中,LANG
变量通常被用作所有未明确设置的 locale 类别的默认值。
2.3 查看当前系统所有可用的 locale
使用 locale -a
列出当前系统中已经配置的 locale 信息。
$ locale -a
C
C.UTF-8
POSIX
zh_CN.utf8
zh_SG.utf8
2.4 安装中文 locale 语言环境/字符集
如果没有发现可用的中文语言环境,则需要安装中文语言包 language-pack-zh-hans。
sudo apt install -y language-pack-zh-hans
2.5 安装 locales 包
用于配置 locale 的工具集,含有 locale-gen
与 update-locale
指令。
sudo apt-get update
sudo apt-get install -y locales
2.6 使用 locale-gen 命令生成语言支持
根据需要生成语言支持,在本示例中,我们使用 locale -a
列出了当前系统所有可用的 locale,发现缺少 en_US.UTF-8
的 locale,使用以下指令进行生成。
$ sudo locale-gen en_US.UTF-8
Generating locales (this might take a while)...
en_US.UTF-8... done
Generation complete.
现在来看看当前是否已经启用了本地支持:
$ locale -a
C
C.UTF-8
POSIX
en_US.utf8
zh_CN.utf8
zh_SG.utf8
locale-gen
命令会修改 /etc/locale.gen
,将 #en_US.UTF-8 UTF-8
前面的注释去掉。
/etc/locale.gen
----
en_US.UTF-8 UTF-8
当然,你也可以使用文本编辑器(如 nano
或 vim
)打开 /etc/locale.gen
文件,并取消注释(删除行首的 #
)你需要的 locale 行,然后保存并关闭文件。
运行 locale-gen
命令来生成你选择的 locale。如果你已经按照上面的步骤修改了 /etc/locale.gen
文件,这一步将基于该文件中的设置来生成 locale。
sudo locale-gen
2.7 设置当前默认字符集
在当前环境设置 LANG
环境变量让其生效。
$ export LANG=en_US.UTF-8
$ 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=
3 持久化
3.1 全局设置
修改系统级别的配置文件,如 /etc/locale.gen
(生成新的 locale)、/etc/profile
(设置全局环境变量)等,然后通过运行相应的命令(如 locale-gen
)和应用配置(如重新登录或重启系统)来使设置生效。
3.2 用户级设置
修改用户主目录下的配置文件,在用户的 shell 配置文件中(如 ~/.bashrc
、~/.bash_profile
、~/.profile
等)添加以下行:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
替换 en_US.UTF-8
为你需要的 locale。然后,重新加载配置文件(例如,通过运行 source ~/.bashrc
)或重新登录以使更改生效。
3.3 使用 update-locale 进行配置
在上面章节中,环境变量的配置仅对当前 bash 会话生效。可以使用 update-locale
命令来全局设置系统的默认字符集,这个命令会更新 /etc/default/locale
文件。
sudo update-locale LANG=en_US.UTF-8
如果你使用普通用户权限去调用 update-locale
命令时,会提示你对于上面提到的默认配置文件没有写权限,需要使用 sudo
指令进行操作。
$ update-locale LANG=en_US.UTF-8
update-locale: Unable to write /etc/default/locale: Permission denied
$ sudo update-locale LANG=en_US.UTF-8
$ cat /etc/default/locale
# File generated by update-locale
LANG=en_US.UTF-8
如果需要删除某个配置,只需要在设置的时候进行留空即可。
sudo update-locale LANGUAGE
将移除(注释掉)对 LANGUAGE
的定义,在定义的前面会加上 #
符号。
$ cat /etc/default/locale
# File generated by update-locale
LANG=en_US.UTF-8
#LANGUAGE=en_US.UTF-8
结论:实测下来,主要是 3.1/3.2 章节会让 locale 生效,update-locale 主要是配置默认参数。
4 参考资料
[1] Docker容器中添加中文字符的支持
[2] docker 容器设置中文环境