Search code examples
linuxubuntulocale

How do I set LC_CTYPE to C?


I'm trying to set LC_CTYPE, LC_COLLATE to C, while keeping the remaining LC_* set to "en_US.UTF-8". I'm working inside an Ubuntu 16.04 VM. My current environment has:

$ 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=

and

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

When I RUN

$ sudo update-locale LC_CTYPE=C

LC_CTYPE doesn't get set

$ 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=

I can see the default has been written to the file

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

but when I source ~/.bashrc or restart the VM, it still doesn't show "C". There also isn't an LC_CYTPE variable (which I don't understand).

$ echo $LC_CTYPE
<empty string here>

What am I missing?


Solution

  • I got it to work by executing unset LC_ALL. Once I did that, export LC_CTYPE=C worked.

    LC_ALL is an override. When it's set, it takes precedence over the other LC_* env variables and the locale command honors that. I found many pages that stated that this variable is usually not set by default.