为什么几乎每个程序都抱怨我的语言环境?


29

我使用的是Arch Linux,并且已按照Wiki上有关设置语言环境的说明进行操作。

几乎每个运行的程序都抱怨语言环境-甚至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-genLOCALE=中两种格式的各种组合/etc/rc.conf,但是没有任何方法可以解决问题。

附加信息:

% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8

布鲁斯·埃迪格(Bruce Ediger)关于设置LANG=CLC_ALL=en_US.UTF-8工作的建议(实际上,设置已LC_ALL解决,设置LANG无关紧要),但我想知道发生了什么。根据SUS,LC_ALL将覆盖所有其他LC_ *变量(如果已设置且不为null)。在我的系统中,它是设置的,但它为null,因此应将其忽略,而应使用其他值。这不是正在发生的事情,似乎应用程序正在setlocale使用进行调用LC_ALLNULL返回并产生错误,即使其他调用setlocale返回了一个好的字符串也是如此。

这里是一个顶级ltracelocale(向右滚动才能看到函数返回值)

% 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吗?
njsg 2012年

我要指出的是,您应该.utf8LOCALE和中使用LC_*,但显然.UTF-8在这里也可以使用...至于en-US:它是否出现在(没有.utf8)中locale -a
njsg 2012年

1
export LANG=Cexport LC_ALL=en_US.UTF-8看看会发生什么。我的Arch linux笔记本电脑LOCALE="en_US.UTF-8"位于/etc/rc.conf中,我不知道笔记本电脑在哪里设置LANG = C。
Bruce Ediger 2012年

您可以张贴您的内容/etc/locale.conf吗?看起来您是不小心写了LANG=en-US(带连字符)而不是了LANG=en_US(带下划线)。
Mikel 2012年

并且的内容也/etc/locale.gen将是有用的。
Mikel 2012年

Answers:


18

您缺少一个缺少$LANG$LC_ALL(或全部)时用于默认语言环境的文件更具体的$LC_whatever)。

在较旧的glibc上,它是/ usr / lib / locale / locale-archive。由于GNU / Linux很混乱,因此您应该使用strace来确定在您的计算机上使用的特定版本中应该包含哪些文件:

strace -e文件语言环境
execve(“ / usr / bin / locale”,[“ locale”],[/ * 36个变量* /])= 0
access(“ / etc / ld.so.preload”,R_OK)= -1 ENOENT(无此类文件或目录)
open(“ / etc / ld.so.cache”,O_RDONLY)= 3
打开(“ /lib/libc.so.6”,O_RDONLY)= 3
open(“ / usr / lib / locale / locale-archive”,O_RDONLY | O_LARGEFILE)= 3

---------------------- 1天后添加的评论:

“ ltrace -S”应该可以,因为它显示了系统调用。

否则,“ ltrace”不是很有用(即适得其反,而不是strace),因为它仅显示最上面的调用。这些很明显(setlocale(3)),而真正的问题发生在libc内。

听起来好像您已经安装了原始语言环境数据,因为en_US.UTF-8可以工作。

如果是这样,则可以使用以下方法来解决您的问题,设置系统范围的默认值:

localedef -f UTF-8 -i en_US en_US.UTF-8

sudo localedef -f UTF-8 -i en_US en_US.UTF-8适用于Raspbian 2018-11-13 Lite。
Ciro Santilli新疆改造中心法轮功六四事件18/12/25

6

就在/etc/locale.conf今天设置之后,我遇到了同样的问题(与对的最新更改有关/etc/rc.conf。以我为例,结果是未安装语言环境。

检查/etc/locale.gen。您的环境变量引用的所有语言环境都必须在其中被激活(即未注释掉)。进行更改后,运行sudo locale-gen以安装所选的语言环境。


2

通过此链接可以解决我的问题:

sudo localectl set-locale LANG=en_CA.UTF-8
# or change to en_US.UTF-8 depends on your locale-gen

它生成/etc/locale.conf解决此问题的文件


1

最近,我遇到了类似的问题,当我不小心删除了“ LOCALE = en_US.utf8”时,所有unicode文件名均显示不正确/etc/rc.conf。所以我检查了启动脚本:

if [[ $DAEMON_LOCALE != [nN][oO] ]]; then
    export LANG=${LOCALE:-C}
    if [[ -r /etc/locale.conf ]]; then
        parse_envfile /etc/locale.conf "${localevars[@]}"
    fi
else
    export LANG=C
fi

简单的方法是同时检查DAEMON_LOCALELOCALE/etc/rc.conf,确保第一个是不是no,第二个是不是空的。


-1

也许其中一项设置无效?这些是我的语言环境设置,仅供参考;它们不会引起任何错误(KUbuntu 12.04):

LANG=en_AU.UTF-8
LANGUAGE=
LC_CTYPE="en_AU.UTF-8"
LC_NUMERIC="en_AU.UTF-8"
LC_TIME="en_AU.UTF-8"
LC_COLLATE="en_AU.UTF-8"
LC_MONETARY="en_AU.UTF-8"
LC_MESSAGES="en_AU.UTF-8"
LC_PAPER="en_AU.UTF-8"
LC_NAME="en_AU.UTF-8"
LC_ADDRESS="en_AU.UTF-8"
LC_TELEPHONE="en_AU.UTF-8"
LC_MEASUREMENT="en_AU.UTF-8"
LC_IDENTIFICATION="en_AU.UTF-8"
LC_ALL=
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.