如何将 LC_CTYPE 设置为 C?

How do I set LC_CTYPE to C?

我正在尝试将 LC_CTYPELC_COLLATE 设置为 C,同时将剩余的 LC_* 设置为 "en_US.UTF-8"。我在 Ubuntu 16.04 VM 中工作。我当前的环境有:

$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8" 
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

$ locale -a
C
C.UTF-8
en_US.utf8
<some other locales>
POSIX

当我运行

$ sudo update-locale LC_CTYPE=C

LC_CTYPE 未设置

$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8" 
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

可以看到默认已经写入文件

$ cat /etc/default/locale
# File generated by update-locale
LC_CTYPE=C

但是当我source ~/.bashrc或重启虚拟机时,它仍然没有显示"C"。也没有 LC_CYTPE 变量(我不明白)。

$ echo $LC_CTYPE
<empty string here>

我错过了什么?

我通过执行 unset LC_ALL 让它工作。一旦我这样做了,export LC_CTYPE=C 就成功了。

LC_ALL 是覆盖。当它被设置时,它优先于其他 LC_* env 变量并且 locale 命令尊重它。我发现很多页面都说默认情况下通常不会设置这个变量。

locale(7) 的联机帮助页解释了如何为类别分配值:

如果 setlocale(3) 的第二个参数是一个空字符串,"", 对于默认语言环境,使用以下内容确定 步骤:

   1. If there is a non-null environment variable LC_ALL, the value
      of LC_ALL is used.

   2. If an environment variable with the same name as one of the
      categories above exists and is non-null, its value is used for
      that category.

   3. If there is a non-null environment variable LANG, the value of
      LANG is used.