Я использую Arch Linux, и я следовал инструкциям в вики по настройке моей локали.
Почти каждая запускаемая программа жалуется на локаль - даже locale
. Это выглядит так:
% locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en-US
LC_TIME=en-US
LC_COLLATE="POSIX"
LC_MONETARY=en-US
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT=en-US
LC_IDENTIFICATION="POSIX"
LC_ALL=
или:
% perl
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_TIME = "en-US",
LC_NUMERIC = "en-US",
LC_MONETARY = "en-US",
LC_MEASUREMENT = "en-US",
LC_CTYPE = "en_US.UTF-8",
LANG = (unset)
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C")
Что-то немного сбивает с толку, что у /etc/locale.gen
него есть несколько примеров; все строки UTF-8 имеют что-то «что-то. UTF-8», и locale-gen
показы запускаются en_US.UTF-8... done
во время его выполнения, но locale -a
, как предполагается, показывают вам доступные показы локалей en_US.utf8
. Я пробовал различные комбинации обоих форматов в /etc/locale-gen
и LOCALE=
в /etc/rc.conf
, но ничего не исправили проблему.
Дополнительная информация:
% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8
Предложение Брюса Эдигера о настройке LANG=C
и работе LC_ALL=en_US.UTF-8
(на самом деле, установка LC_ALL
исправила это, настройка LANG
не имела значения), но я хотел бы знать, что происходит. Согласно SUS , LC_ALL переопределит все другие переменные LC_ *, если он установлен и не равен нулю. В моей системе оно установлено, но оно пустое, поэтому его следует игнорировать, а вместо него следует использовать другие значения. Это не то , что происходит, кажется , что приложения вызова setlocale
с LC_ALL
, получая NULL
обратно, и генерируется ошибка, даже когда другие вызовы setlocale
возвращают хорошую строку.
Вот верхушка ltrace
из locale
(прокрутки вправо , чтобы увидеть функции возвращают значения)
% ltrace locale
(0, 0, 0, -1, 0x7f5c1ae44510) = 0x7f5c1ae47140
__libc_start_main(0x401d70, 1, 0x7fff7c8cfbf8, 0x404610, 0x4046a0 <unfinished ...>
setlocale(0, "") = "en_US.UTF-8"
setlocale(5, "") = "en_US.UTF-8"
textdomain("libc") = "libc"
argp_parse(0x607280, 1, 0x7fff7c8cfbf8, 0, 0x7fff7c8cfad4) = 0
setlocale(6, "") = NULL
dcgettext(0, 0x405aa8, 5, 0, 0) = 0x405aa8
error(0, 2, 0x405aa8, 1, 0locale: Cannot set LC_ALL to default locale: No such file or directory)
источник
locale -a
?.utf8
вLOCALE
иLC_*
, но, видимо,.UTF-8
работает и здесь ... Что касается en-US: он появляется (без.utf8
) вlocale -a
?export LANG=C
иexport LC_ALL=en_US.UTF-8
посмотри что получится. В моем ноутбуке Arch Linux естьLOCALE="en_US.UTF-8"
/etc/rc.conf, и я не могу понять, где мой ноутбук устанавливает LANG = C./etc/locale.conf
? Похоже, вы случайно написалиLANG=en-US
(с дефисом) вместоLANG=en_US
(с подчеркиванием)./etc/locale.gen
было бы тоже полезно.Ответы:
Вам не хватает файла, который будет использоваться по умолчанию для локали при отсутствии
$LANG
или$LC_ALL
(или всех более конкретных$LC_whatever
) настроек.В старых версиях glibc это / usr / lib / locale / locale-archive. Поскольку GNU / Linux хаотичен, вы должны использовать strace, чтобы определить, какие файлы ожидаются в определенных версиях, используемых на вашем компьютере:
---------------------- Комментарии добавлены 1 день спустя:
«ltrace -S» должно быть в порядке, так как показывает системные вызовы.
В противном случае, «ltrace» не очень полезен (то есть он контрпродуктивен по сравнению со strace), потому что он показывает только самые верхние вызовы. Это очевидно (setlocale (3)), тогда как реальная проблема возникает в libc.
Похоже, у вас установлены необработанные данные локали, так как en_US.UTF-8 работает.
Если это так, то что-то вроде этого должно решить вашу проблему, установив общесистемное значение по умолчанию:
источник
sudo localedef -f UTF-8 -i en_US en_US.UTF-8
работает по Raspbian 2018-11-13 Lite.У меня была такая же проблема после настройки
/etc/locale.conf
только сегодня (касающаяся недавних изменений в/etc/rc.conf
. В моем случае оказалось, что локали не были установлены.Проверьте
/etc/locale.gen
. Все локали, на которые ссылаются ваши переменные среды, должны быть там активированы (т.е. не закомментированы). После внесения изменений запустите,sudo locale-gen
чтобы установить выбранные локали.источник
Переход по этой ссылке решает мою проблему:
он генерирует файл,
/etc/locale.conf
который решает эту проблемуисточник
Недавно у меня были похожие проблемы, все имена файлов Unicode отображались неправильно, когда я случайно удалил 'LOCALE = en_US.utf8' в
/etc/rc.conf
. Итак, я проверил загрузочный скрипт:Простое решение проверить , как
DAEMON_LOCALE
иLOCALE
в/etc/rc.conf
, убедитесь , что первый не былno
и второй один не был пуст.источник
Может быть, одна из ваших настроек недействительна? Это мои настройки локали для справки; они не вызывают никаких ошибок (KUbuntu 12.04):
источник