Я використовую 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 є "something.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
?