9.7. 配置系统 Locale

下面将创建的 /etc/locale.conf 设定本地语言支持需要的若干环境变量,正确设定它们可以带来以下好处:

将下面的 <ll> 替换为所需语言的双字符代号 (例如en),<CC> 替换为国家或地区的双字符代号 (例如GB),<charmap> 替换为您选定的 locale 的标准字符映射。另外,还可以加入 @euro 等可选修饰符。

Glibc 支持的所有 locale 可以用以下命令列出:

locale -a

字符映射可能有多个别名,例如ISO-8859-1也可以称为iso8859-1或者iso88591。某些程序不能正确处理一些别名 (例如,UTF-8必须写作UTF-8才能识别,而不能识别utf8),因此在多数情况下,为了保险起见,最好使用 locale 的规范名称。为了确定规范名称,执行以下命令,将 <locale 名> 替换成 locale -a 对于您希望的 locale 的输出 (以en_GB.iso88591为例)。

LC_ALL=<locale 名> locale charmap

对于 en_GB.iso88591 locale,以上命令输出:

ISO-8859-1

这样就最终确定 locale 应设置为 en_GB.ISO-8859-1。在将以上启发方法获得的 locale 添加到 Bash 启动文件之前,一定要进行下列测试:

LC_ALL=<locale 名> locale language
LC_ALL=<locale 名> locale charmap
LC_ALL=<locale 名> locale int_curr_symbol
LC_ALL=<locale 名> locale int_prefix

以上命令应该输出语言名称,选定 locale 使用的字符编码,本地货币符号,以及所在国家或地区的国际电话区号。如果以上某个命令失败并输出类似下面这样的消息,意味着您的 locale 在第 8 章中没有安装,或者不被 Glibc 的默认安装支持。

locale: Cannot set LC_* to default locale: No such file or directory

如果出现了这种消息,您应该用 localedef 命令安装所需的 locale,或重新选择一个不同的 locale。后文假设 Glibc 没有输出类似错误消息。

某些 LFS 以外的软件包可能缺乏对您选择的 locale 的支持,例如 X 库 (X 窗口系统的一部分),它在您的 locale 与它内部文件中的字符映射表名不完全匹配时,会输出以下错误消息:

Warning: locale not supported by Xlib, locale set to C

某些情况下 Xlib 期望字符映射以带有规范连字符的大写形式给出,例如应该使用 “ISO-8859-1”而不是“iso88591”。有时也可以通过去除 locale 规范中的字符映射部分找到合适的规范,可以通过运行 locale charmap 确认。例如,您需要将“de_DE.ISO-8859-15@euro”替换成“de_DE@euro”,以获得 Xlib 能够识别的 locale。

其他软件包在 locale 名不符合它们的期望时可能工作不正常(但未必输出错误消息)。在这种情况下,探索一下其他 Linux 发行版是如何支持您的 locale 的,可以得到一些有用的信息。

在确定了正确的 locale 设置后,创建 /etc/locale.conf 文件:

cat > /etc/locale.conf << "EOF"
LANG=<ll>_<CC>.<charmap><@modifiers>
EOF

修改 /etc/locale.conf 的另一种方法是使用 systemd 的 localectl 工具。例如,要使用 localectl 完成上面给出的 locale 设置,运行命令:

localectl set-locale LANG="<ll>_<CC>.<charmap><@modifiers>"

您也可以指定其他语言相关的环境变量,例如 LANGLC_CTYPELC_NUMERIC,或 locale 输出的其他环境变量,用空格将它们分割即可。例如,将 LANG 设置为 en_US.UTF-8,LC_CTYPE 设置为 en_US:

localectl set-locale LANG="en_US.UTF-8" LC_CTYPE="en_US"
[注意]

注意

请注意 localectl 命令在 chroot 环境无法工作。只有在使用 systemd 引导 LFS 系统后才能使用它。

C (默认 locale) 和en_US(推荐美式英语用户使用的 locale) 是不同的。C locale 使用 US-ASCII 7 位字符集,并且将最高位为 1 的字节视为无效字符。因此,ls 等命令会将它们替换为问号。另外,如果试图用 Mutt 或 Pine 发送包含这些字符的邮件,会发出不符合 RFC 标准的消息 (发出邮件的字符集会被标为未知 8 位)。因此,您只能在确信自己永远不会使用 8 位字符时才能使用C locale。