%general-entities; ]> 配置系统 Locale /etc/locale.conf 下面将创建的 /etc/locale.conf 设定本地语言支持必要的环境变量,将它们正确设定后, 可以得到以下好处: 程序输出被翻译成本地语言 字符被正确分类为字母、数字和其他类别, 这对于使 bash 正确接受命令行中的非 ASCII 本地字符来说是必要的 根据所在地区惯例排序字母 适用于所在地区的默认纸张尺寸 正确格式化货币、时间和日期值 译注 译者强烈反对在 /etc/locale.conf 中指定中文 locale。由于字符终端的局限性,它根本无法显示中文字符。 使用中文 locale 将导致许多程序输出中文消息, 结果在字符终端中都显示为问号。建议在 /etc/locale.conf 中指定英文 locale , 在 BLFS 中安装了图形环境后再将 LANG=zh_CN.UTF-8 写入 .xprofile 等图形界面配置文件, 这样即可在字符终端中使用英文 locale ,而在图形界面中使用中文。 将下面的 <ll> 替换为所需语言的双字符代号(例如 en), <CC> 替换为国家或地区的双字符代号 (例如 GB), <charmap> 替换为您选定的 locale 的标准字符映射。另外,还可以加入 @euro 之类的可选修饰符。 Glibc 支持的所有 locale 可以用以下命令列出: locale -a 字符映射可能有多个别名,例如 ISO-8859-1 也可以称为 iso8859-1iso88591。 某些程序不能正确处理一些别名(例如,只识别 UTF-8, 不能识别 utf8),因此在多数情况下,为了保险起见, 最好使用 locale 的规范名称。为了确定规范名称,执行以下命令, 将 <locale name> 替换成 locale -a 对于您希望的 locale 的输出 (以 en_GB.iso88591 为例)。 LC_ALL=<locale name> locale charmap 对于 en_GB.iso88591 locale,以上命令输出: ISO-8859-1 这样就最终确定 locale 应设置为 en_GB.ISO-8859-1。 在将以上启发方法获得的 locale 添加到 Bash 启动文件之前, 一定要进行下列测试: LC_ALL=<locale name> locale language LC_ALL=<locale name> locale charmap LC_ALL=<locale name> locale int_curr_symbol LC_ALL=<locale name> locale int_prefix 以上命令应该输出语言名称、选定 locale 使用的字符编码、 本地货币符号以及所在国家或地区的国际电话区号。 如果以上某个命令失败并输出类似下面这样的消息, 意味着您的 locale 在第 6 章中没有安装,或者不被 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 您也可以使用 systemd 的 localectl 工具修改 /etc/locale.conf 。如果希望使用 localectl 创建以上例子中的 locale.conf,运行: localectl set-locale LANG="<ll>_<CC>.<charmap><@modifiers>" 您也可以指定其他语言相关的环境变量,例如 LANGLC_CTYPELC_NUMERIClocale 输出的其他环境变量,用空格将它们分割即可。 例如,将 LANG 设置为 en_US.UTF-8,但 LC_CTYPE 设置为 en_US: localectl set-locale LANG="en_US.UTF-8" LC_CTYPE="en_US" 译注 这种设置的好处是使得一些程序(如 gcc) 不使用 UTF-8 引号。默认终端字体不包含 UTF-8 字形,因此 UTF-8 引号会显示为一个白底黑字问号。如果希望使用 UTF-8 引号, 参阅 BLFS 中的说明安装支持 UTF-8 符号的终端字体。 请注意 localectl 只能在使用 systemd 引导的系统中使用。 C (默认 locale)和 en_US (推荐美式英语用户使用的 locale)是不同的。 C locale 使用 US-ASCII 7 位字符集,并且将最高位为 1 的字节视为无效字符。因此,ls 等命令会将它们替换为问号。另外,如果试图用 Mutt 或 Pine 发送包含这些字符的邮件,会发出不符合 RFC 标准的消息 (发出邮件的字符集会被标为 未知 8 位)。 因此,您只能在确信自己永远不会使用 8 位字符时才能使用 C locale。 许多程序不能很好地支持基于 UTF-8 的 locale, 我们正在努力记录并(如果可能的话)修复它们,参阅