为什么几乎每个程序都抱怨我的区域设置?

为什么几乎每个程序都抱怨我的区域设置?

我正在使用 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会显示,但是,它应该显示可用的区域设置显示。我已经尝试了 in和in两种格式的各种组合,但没有解决问题。en_US.UTF-8... donelocale -aen_US.utf8/etc/locale-genLOCALE=/etc/rc.conf

附加信息:

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

布鲁斯·艾迪格(Bruce Ediger)的设置建议LANG=C有效LC_ALL=en_US.UTF-8(事实上,设置LC_ALL修复了它,设置LANG并不重要),但我想知道发生了什么。根据不锈钢,如果设置了 LC_ALL 并且不为空,则 LC_ALL 将覆盖所有其他 LC_* 变量。在我的系统中,它被设置了,但它是空的,所以应该忽略它,而应该使用其他值。事实并非如此,应用程序似乎正在调用setlocaleLC_ALL获取NULL返回值并生成错误,即使其他调用setlocale返回一个好的字符串也是如此。

ltrace这是of 的顶部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)  

答案1

您缺少一个文件,该文件将用于在缺少$LANG$LC_ALL(或全部更具体的$LC_whatever)被设置。

在较旧的 glibc 上,它是/usr/lib/locale/locale-archive.因为 GNU/Linux 很混乱,所以您应该使用 strace 来确定您的计算机上使用的特定版本中需要哪些文件:

strace -e 文件区域设置
execve("/usr/bin/locale", ["locale"], [/* 36 vars */]) = 0
access("/etc/ld.so.preload", R_OK) = -1 ENOENT(没有这样的文件或目录)
打开(“/etc/ld.so.cache”,O_RDONLY)= 3
打开(“/lib/libc.so.6”,O_RDONLY)= 3
打开(“/ 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

答案2

今天设置后我遇到了同样的问题/etc/locale.conf(与最近的更改有关)/etc/rc.conf。就我而言,事实证明没有安装语言环境。

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

答案3

按照此关联解决了我的问题:

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

/etc/locale.conf它会生成一个修复此问题的文件

答案4

也许您的其中一项设置无效?这些是我的区域设置供参考;它们不会导致任何错误(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=

相关内容