Sha*_*off 31 arch-linux glibc locale
我正在使用 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=
Run Code Online (Sandbox Code Playgroud)
或者:
% 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")
Run Code Online (Sandbox Code Playgroud)
有点令人困惑的是,/etc/locale.gen
有几个例子;所有 UTF-8 行都有“something.UTF-8”,并且在它运行时运行locale-gen
显示en_US.UTF-8... done
,但是locale -a
,它应该向您显示可用的语言环境显示en_US.utf8
。我尝试了 in/etc/locale-gen
和LOCALE=
in两种格式的各种组合/etc/rc.conf
,但没有解决问题。
附加信息:
% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8
Run Code Online (Sandbox Code Playgroud)
设置的布鲁斯Ediger的建议LANG=C
和LC_ALL=en_US.UTF-8
工作(其实,设置LC_ALL
固定它,设置LANG
没有事),但我想知道发生了什么。根据SUS,如果 LC_ALL 已设置且不为空,则 LC_ALL 将覆盖所有其他 LC_* 变量。在我的系统中,它是设置的,但它是空的,所以应该忽略它,而应该使用其他值。这不是正在发生的事情,似乎应用程序正在调用setlocale
with 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)
Run Code Online (Sandbox Code Playgroud)
小智 19
您缺少一个文件,该文件将用于在没有设置$LANG
or $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 open("/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
Run Code Online (Sandbox Code Playgroud)
我在/etc/locale.conf
今天设置后遇到了同样的问题(与最近对/etc/rc.conf
. 的更改有关。就我而言,结果证明未安装语言环境。
检查/etc/locale.gen
。您的环境变量引用的所有语言环境都必须在其中激活(即未注释掉)。进行更改后,运行sudo locale-gen
以安装选定的语言环境。
归档时间: |
|
查看次数: |
36235 次 |
最近记录: |