ほとんどすべてのプログラムがロケールに関してエラーを出すのはなぜですか?

ほとんどすべてのプログラムがロケールに関してエラーを出すのはなぜですか?

私は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... donelocale -aen_US.utf8/etc/locale-genLOCALE=/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関係ありません)。しかし、何が起こっているのか知りたいです。SUSLC_ALL が設定されていて null でない場合、他のすべての LC_* 変数が上書きされます。私のシステムでは、設定されていますが null なので無視され、代わりに他の値を使用する必要があります。これは発生していません。他の呼び出しが適切な文字列を返す場合でも、アプリケーションが を呼び出しsetlocaleLC_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)  

答え1

$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 (そのようなファイルまたはディレクトリはありません)
オープン("/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

答え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

設定の 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=

関連情報