Почему настройка 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 ответ

Решение

One of the features relevant to the system affected by locale settings is the text encoding, or the "charset", or the "codepage" – taken from the LC_CTYPE parameter. Although in many situations the text encoding is given by specification (eg D-Bus protocol strings are always UTF-8), there are also many places where the encoding is unspecified and has to be taken from the current system locale.

In particular, filenames are frequently shown according to the current locale text encoding. Programs written in Python 3, for example, use the current locale encoding if the program forgets to specify otherwise.

The 'C' locale implies 7-bit ASCII text encoding (ANSI_X3.4-1968), and part of your problem may be that while many programs (those written in C, generally) interpret this to allow arbitrary 8-bit values, there are also many programs which have a much stricter interpretation and reject any values above 127 (ie non-ASCII) as invalid. It might be that a decoding error is caused by some file name, or some configuration parameter, or some other text file.

Фактически, в этот момент вы даже найдете программы, которые категорически отказываются работать с локалью, которая задает кодировку текста ASCII - некоторые из них требуют специально UTF-8 (например, gnome-терминал), а некоторые другие требуют любых 8- битовое кодирование.

Если ваш дистрибутив применяет исправление "C.UTF-8" к libc, используйте его:

LANG=C.UTF-8

Если нет, используйте одно из следующих:

ЛАНГ =en_US.UTF-8
LC_TIME= С
LC_COLLATE= С
LC_MESSAGES= С
ЛАНГ = С
LC_CTYPE = en_US.UTF-8

(Вы можете запустить locale charmap чтобы увидеть, какая кодовая страница действует в соответствии с текущими переменными среды - в обоих случаях следует указать UTF-8. Если вы выберете третий вариант, остерегайтесь ошибочных программ, которые напрямую смотрят на $LANG, а не вызывают nl_langinfo(CODESET), как следовало бы.)

Другие вопросы по тегам