Ubuntu locale命令介绍(查询和设置当前用户的语言、国家/地区以及字符编码等环境设置)
好的,我们来详细介绍一下 locale
命令。
locale
命令简介
locale
是一个在 Linux 和其他类 Unix 系统中非常重要的命令。它的核心作用是查询和设置当前用户的语言、国家/地区以及字符编码等环境设置。
这些设置统称为 “locale”(地域/本土化设置),它们会影响到程序的界面语言、日期的显示格式、数字的表示方式(例如小数点和千位分隔符)、货币符号以及字符的排序规则等。
简单来说,locale
决定了你的系统如何与你进行“文化上”的交流。
1. 什么是 Locale?
一个 Locale 设置通常由三个部分组成,格式为 [language[_territory][.codeset][@modifier]]
:
- language: 语言代码,遵循 ISO 639 标准(例如
en
表示英语,zh
表示中文)。 - territory: 国家/地区代码,遵循 ISO 3166 标准(例如
US
表示美国,CN
表示中国大陆,TW
表示中国台湾)。 - codeset: 字符集或编码方式(例如
UTF-8
,GBK
)。 - modifier: 可选的修饰符(例如
@euro
表示使用欧元作为货币符号)。
常见示例:
en_US.UTF-8
: 美国英语,使用 UTF-8 编码。zh_CN.UTF-8
: 中国大陆简体中文,使用 UTF-8 编码。zh_TW.Big5
: 中国台湾繁体中文,使用 Big5 编码。C
或POSIX
: 这是最基础的 locale,使用 ASCII 字符集,为程序提供了一个可预测的、不受地域影响的环境。
2. locale
命令基本用法
2.1 查看当前所有 Locale 设置
不带任何参数直接运行 locale
,它会列出当前环境中所有与 locale 相关的环境变量及其值。
locale
示例输出:
LANG=zh_CN.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=
2.2 查看系统上所有可用的 Locale
使用 -a
或 --all-locales
选项,可以列出你的系统当前已经生成并且支持的所有 locale。
locale -a
示例输出(部分):
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
...
zh_CN
zh_CN.gbk
zh_CN.utf8
zh_HK.utf8
zh_SG.utf8
zh_TW.utf8
如果这里没有你想要的 locale(比如 zh_CN.UTF-8
),你可能需要先生成它。在基于 Debian/Ubuntu 的系统中,通常通过编辑 /etc/locale.gen
文件并运行 locale-gen
命令来完成。
2.3 查看某个具体分类的详细信息
使用 -k
或 --keyword
选项,可以查看某个 LC_*
分类的详细定义。
locale -k LC_NUMERIC
示例输出:
decimal_point="."
thousands_sep=","
grouping=3;3
...
这个输出告诉我们,在当前的 locale 设置下,小数点是 .
,千位分隔符是 ,
。
3. 理解 locale
的输出 (LC_* 变量)
locale
的输出由一系列 LC_*
环境变量组成,每个变量控制一个特定的方面。
-
LANG
: 这是最主要的变量。它为所有未单独设置的LC_*
变量提供一个默认值。如果你设置了LANG
,但没有设置LC_TIME
,那么LC_TIME
的值就会继承自LANG
。 -
LC_CTYPE
: 字符分类和转换。- 决定了字符的处理方式,例如哪些是字母、哪些是数字、哪些是大写、哪些是小写。
- 直接关系到系统能否正确识别和处理多字节字符(如汉字)。如果这个设置错误,可能会导致终端出现乱码。
-
LC_NUMERIC
: 数字格式。- 定义非货币数字的格式,如小数点符号和千位分隔符。
en_US
:1,234,567.89
de_DE
:1.234.567,89
-
LC_TIME
: 时间和日期格式。- 定义日期和时间的显示格式。
en_US
:Fri Oct 27 10:30:00 AM PDT 2023
zh_CN
:2023年10月27日 星期五 10:30:00 CST
-
LC_COLLATE
: 字符串排序规则。- 定义了字符串比较和排序的顺序。
ls
、sort
等命令的行为受此影响。 C
locale: 按字节值排序 (a, B, c
)。en_US
locale: 忽略大小写或按字典序排序 (a, c, B
可能会排在c
之后)。zh_CN
locale: 按拼音或笔画排序。
- 定义了字符串比较和排序的顺序。
-
LC_MONETARY
: 货币格式。- 定义货币符号、小数点、千位分隔符等。
en_US
:$1,234.56
en_GB
:£1,234.56
-
LC_MESSAGES
: 程序消息和提示语言。- 决定了系统和应用程序显示的提示信息、错误信息、菜单等的语言。
en_US
:File not found
fr_FR
:Fichier non trouvé
-
LC_ALL
: 最高优先级的覆盖变量。- 这是一个特殊的变量。如果设置了
LC_ALL
,它会强制覆盖所有其他的LANG
和LC_*
变量的设置。 - 它通常用于调试或在脚本中创建一个临时、统一的语言环境,以避免不同用户的
LC_*
设置导致脚本行为不一致。例如,很多脚本开头会写export LC_ALL=C
来确保排序和文本处理的一致性。
- 这是一个特殊的变量。如果设置了
4. 如何设置/修改 Locale
4.1 临时修改(仅对当前终端会话有效)
你可以使用 export
命令来临时修改 locale 设置。这在你需要为某个特定任务改变环境时非常有用。
# 临时将整个环境切换到英文,以方便查看英文日志或帮助文档
export LANG=en_US.UTF-8# 运行你的命令,例如 man ls,此时 man 手册会显示英文
man ls# 如果只想改变排序规则,而不影响其他设置
export LC_COLLATE=C
ls -l
# 退出当前终端后,设置会失效
4.2 永久修改(对当前用户有效)
要为你的用户账户永久设置 locale,你需要将 export
命令添加到你的 shell 启动文件中。
-
打开你的 shell 配置文件,常见的有:
~/.bashrc
(用于 Bash)~/.zshrc
(用于 Zsh)~/.profile
(在登录时加载)
-
在文件末尾添加你想要的设置,例如:
export LANG="zh_CN.UTF-8" export LC_ALL="" # 确保 LC_ALL 为空,否则它会覆盖 LANG
-
保存文件,然后重新登录或运行
source ~/.bashrc
使其立即生效。
4.3 永久修改(对整个系统有效)
这通常由系统管理员操作,需要 sudo
权限。修改方法因 Linux 发行版而异。
-
基于 systemd 的系统 (如 Ubuntu 18.04+, CentOS 7+, Debian 9+):
推荐使用localectl
命令。# 查看当前系统 locale localectl status# 设置系统 locale sudo localectl set-locale LANG=zh_CN.UTF-8
这会自动修改
/etc/locale.conf
文件。 -
传统的系统 (如老版本的 Debian/Ubuntu):
直接编辑/etc/default/locale
文件。# /etc/default/locale LANG="zh_CN.UTF-8"
修改后通常需要重启系统才能完全生效。
总结
locale
命令是管理 Linux 系统国际化和本地化的一个关键工具。
- 核心作用:查询和设置语言、地区、编码等环境。
- 解决的问题:程序界面语言、乱码、日期/数字格式、排序规则。
- 关键变量:
LANG
是默认值。LC_*
分别控制特定方面。LC_ALL
是最高权限的覆盖设置,常用于脚本中保证环境一致性。
- 操作:
locale
查看当前设置。locale -a
查看所有可用设置。export
临时修改。- 修改
~/.bashrc
或使用localectl
进行永久修改。
正确配置 locale 是保证系统和应用程序正常运行的基础,尤其是在处理非英文字符时至关重要。