只是想知道我在 CentOS 7 系统上的情况:
$ locale -a
<snip>
en_US.utf8
<snip>
但是:
$ localectl
System Locale: LANG=en_US.UTF-8
除此之外,根据 X11 (/usr/share/X11/locale/locale.dir) 的首选名称是:
$ grep 'en_US.UTF-8$' /usr/share/X11/locale/locale.dir
en_US.UTF-8/XLC_LOCALE en_US.UTF-8
en_US.UTF-8/XLC_LOCALE: en_US.UTF-8
幸运的是,对于 en_US.utf8,有一个别名:
$ grep 'en_US.utf8' /usr/share/X11/locale/locale.alias
en_US.utf8 en_US.UTF-8
en_US.utf8: en_US.UTF-8
其他一些则没有那么幸运,例如 ru_UA.utf8:
$ locale -a | grep ru_UA.utf8
ru_UA.utf8
$ grep 'ru_UA.utf8' /usr/share/X11/locale/locale.alias
$ grep 'ru_UA.UTF-8' /usr/share/X11/locale/locale.dir
en_US.UTF-8/XLC_LOCALE ru_UA.UTF-8
en_US.UTF-8/XLC_LOCALE: ru_UA.UTF-8
如果所选语言环境不在 X11 locale.alias 中,这会有点烦人,因为 GDM(或 gnome-session?)强制使用“utf8”版本,从而破坏 X 程序,并显示以下消息:“警告:语言环境不存在”由 Xlib 支持,语言环境设置为 C"。我可以只需编辑 /usr/share/X11/locale/locale.alias 即可,但最好能获得有关哪个版本实际上正确的更多信息。
答案1
GNU libc 源代码 (intl/l10nflist.c:_nl_normalize_codeset) 中的注释状态:
代码集名称没有标准。
该函数将代码集名称标准化为全小写,并删除所有非字母数字字符,即“UTF-8”变为“utf8”。
语言环境存档内的语言环境名称使用规范化的代码集名称。
由于没有标准,GDM 完全有权利使用“utf8”,而像“ru_UA.utf8”这样的语言环境则没有无效的。 “utf8”可能不是首选,但它绝对是可以接受的(至少按照 libc 标准),因为它是标准化形式。