Я использую 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)
.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было бы тоже полезно.
locale -a?