在 UTF-8 的区域设置中使用的正确编码名称是什么?

在 UTF-8 的区域设置中使用的正确编码名称是什么?

只是想知道我在 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 标准),因为它是标准化形式。

相关内容