为什么设置 LANG=C 会破坏 CentOS 7 上的控制台登录

为什么设置 LANG=C 会破坏 CentOS 7 上的控制台登录

我通常将所有区域设置都设置为“C”。这是我习惯的。我喜欢ls按照过去几十年习惯的方式来排序。

LANG=C所以想象一下,当我设置.bashrc并登录时没有窗口管理器时的惊讶和沮丧。

这能修复吗?

更新:可能是这样LC_ALL=C。两者之一正在破坏它。 LC_COLLATE=C修复了一些问题,但没有修复其他问题。

-E

Linux xxxx 3.10.0-957.10.1.el7.x86_64 #1 SMP Mon Mar 18 15:06:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

答案1

受区域设置影响的系统相关功能之一是文本编码,或“字符集”或“代码页”——取自 LC_CTYPE 参数。尽管在许多情况下文本编码是由规范给出的(例如,D-Bus 协议字符串始终为 UTF-8),但也有许多地方未指定编码,必须从当前系统区域设置中获取。

尤其,文件名通常根据当前语言环境文本编码显示。例如,如果程序忘记指定其他语言环境编码,则用 Python 3 编写的程序将使用当前语言环境编码。

'C' 语言环境意味着 7 位 ASCII 文本编码 (ANSI_X3.4-1968),而您的问题的一部分可能是虽然许多程序(通常是用 C 编写的)将其解释为允许任意的 8 位值,但也有许多程序具有更严格的解释和拒绝任何大于 127 的值(即非 ASCII)都视为无效。解码错误可能是由某些文件名、某些配置参数或其他文本文件引起的。

事实上,此时您甚至会发现一些程序完全拒绝使用指定 ASCII 文本编码的区域设置 - 其中一些程序特别需要 UTF-8(例如 gnome-terminal),而另一些程序则需要任何 8 位编码。

如果你的发行版对 libc 应用了“C.UTF-8”补丁,请使用它:

LANG=C.UTF-8

如果没有,请使用下列方法之一:

LANG=en_US.UTF-8
LC_TIME=C
LC_COLLATE=C
LC_MESSAGES=C
语言=C
LC_CTYPE=en_US.UTF-8

(您可以运行locale charmap以根据当前环境变量查看有效的代码页 - 在两种情况下都应该显示 UTF-8。如果您选择第三个选项,请小心直接查看 $LANG 而不是调用的错误程序nl_langinfo(代码集)正如他们应该做的那样。

相关内容