Locale 是 Linux 国际化(i18n)的核心概念。理解它,是解决中文显示、输入问题的基础。


一、为什么需要设定 Locale

设定 Locale 与浏览中文网页无关。 即使 Locale 设为 en_US.ISO-8859-1,只要有合适的字体,浏览器照样能显示中文——浏览器自己会检测网页编码并选择对应的字体渲染。

但 Locale 与"写中文"直接相关。 如果你需要在终端输入中文、让程序识别中文作为有效字符、让系统消息显示为中文,就必须设定正确的 Locale。

简单说:看中文靠字体,写中文靠 Locale。


二、什么是 Locale

Locale 是根据用户的语言、国家/地区和文化传统定义的软件运行时语言环境。它涵盖了日常使用的方方面面:

类别变量控制内容
字符分类LC_CTYPE哪些字符是合法的、大小写转换、标点分类
排序规则LC_COLLATE字符串比较和排序顺序
消息语言LC_MESSAGES提示信息、错误信息、菜单的语言
时间格式LC_TIME日期时间的显示格式
数字格式LC_NUMERIC小数点、千分位分隔符
货币格式LC_MONETARY货币符号和格式
姓名格式LC_NAME姓名书写方式
地址格式LC_ADDRESS地址书写方式
电话格式LC_TELEPHONE电话号码格式
度量衡LC_MEASUREMENT公制/英制
纸张大小LC_PAPERA4 / Letter 等
概述LC_IDENTIFICATIONLocale 自身的元数据

Locale 定义文件存放在 /usr/share/i18n/locales/,如 zh_CNen_US 等。


三、什么是字符集

Unicode 是一个静态的编号表,为已知所有符号分配唯一编号(如 U59D0 = “姐”)。

字符集(Charset/Codeset) 是这些编号的编码方式——同一个字符在传输时用几个字节表示:

字符集编码方式
UTF-8拉丁字母 1 字节,常用中文 3 字节,罕见字符 4 字节
GB2312所有字符 2 字节,仅含简体中文
GBKGB2312 超集,2 字节,含繁体
GB18030变长编码(1/2/4 字节),中国国家标准
ISO-8859-1西欧语言,1 字节,不含中文

四、Locale 名称的含义

格式:语言[_地域][.字符集][@修正项]

Locale含义
zh_CN.UTF-8中文 + 中国 + UTF-8 编码
zh_TW.BIG5中文 + 台湾 + Big5 编码
en_GB.ISO-8859-1英文 + 英国 + ISO-8859-1
de_DE.UTF-8@euro德语 + 德国 + UTF-8 + 欧洲习惯修正

五、Locale 的优先级

LC_ALL > LC_* > LANG
  • LC_ALL:最高优先级,覆盖所有其他设置
  • LC_CTYPE:单独控制某一类别
  • LANG:默认值,未单独设置的类别都使用 LANG 的值

示例

设置效果
LANG=zh_CN.UTF-8所有类别用中文
LANG=zh_CN.UTF-8 + LC_MESSAGES=en_US.UTF-8系统消息用英文,其余用中文
LANG=en_US.UTF-8 + LC_CTYPE=zh_CN.UTF-8字符分类用中文(可输入中文),其余用英文
LC_ALL=zh_CN.UTF-8强制所有类别用中文,忽略 LANG 和 LC_*

六、中文输入的关键:LC_CTYPE

LC_CTYPE 决定了系统内哪些字符是"合法"的。中文 Locale(如 zh_CN)会在 LC_CTYPE 中定义 hanzi(汉字)类别,让中文字符成为有效字符。

英文 Locale(如 en_US)中没有定义汉字,因此中文字符不被视为有效输入。

如果你需要中文输入但保持英文界面(最常见的开发者需求):

export LANG=en_US.UTF-8
export LC_CTYPE=zh_CN.UTF-8

这样系统消息是英文,但可以输入和显示中文。


七、Locale 的设置方法

临时设置(当前终端)

export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

永久设置(单用户)

~/.bashrc~/.profile 中添加 export 命令。

永久设置(全局)

编辑 /etc/default/locale(Debian/Ubuntu)或 /etc/locale.conf(CentOS/RHEL):

LANG=zh_CN.UTF-8

查看与生成 Locale

# 查看当前 locale
locale

# 查看系统支持的所有 locale
locale -a

# 生成指定 locale(Debian/Ubuntu)
sudo locale-gen zh_CN.UTF-8
sudo update-locale LANG=zh_CN.UTF-8

# 生成指定 locale(RHEL/CentOS)
sudo localectl set-locale LANG=zh_CN.UTF-8

参考:ChinaUnix.net