web-dev-qa-db-ja.com

ほぼすべてのプログラムが私のロケールについて不満を言うのはなぜですか?

私は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

LANG=CLC_ALL=en_US.UTF-8の設定に関するBruce Edigerの提案は機能しました(実際、LC_ALLを設定すると修正され、LANGの設定は問題になりませんでした)。何が起こっていますか。 [〜#〜] sus [〜#〜] によると、LC_ALLは、それが設定されていてヌルでない場合、他のすべてのLC_ *変数をオーバーライドします。私のシステムでは設定されていますが、nullなので無視して、代わりに他の値を使用する必要があります。それは何が起こっているのかではありません。アプリケーションがsetlocaleLC_ALLで呼び出し、NULLを返し、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)  
29
Shawn J. Goff

$LANGまたは$LC_ALL(またはallより具体的な$LC_whatever)がない場合にロケールのデフォルト設定に使用されるファイルがありませんセットする。

古いglibcでは、/ usr/lib/locale/locale-archiveです。 GNU/Linuxは無秩序であるため、straceを使用して、マシンで使用されている特定のバージョンで予想されるファイルを判別する必要があります。

 strace -e file locale 
 execve( "/ usr/bin/locale"、["locale"]、[/ * 36 vars * /])= 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」は、syscallsを表示するため、問題ないはずです。

それ以外の場合、「ltrace」は最上位の呼び出しのみを表示するため、あまり役に立ちません(つまり、straceと比較すると逆効果です)。それらは明白ですが(setlocale(3))、実際の問題はlibc内で発生します。

En_US.UTF-8が機能するため、rawロケールデータがインストールされているようです。

その場合は、このようなもので問題が解決され、システム全体のデフォルトが設定されます。

localedef -f UTF-8 -i en_US en_US.UTF-8
18
A R

/etc/locale.confを設定した直後に同じ問題が発生しました(/etc/rc.confへの最近の変更に関して)。私の場合、ロケールがインストールされていないことがわかりました。

/etc/locale.genを確認してください。環境変数が参照するすべてのロケールがそこでアクティブ化されている(つまり、コメント化されていない)必要があります。変更を加えたら、Sudo locale-genを実行して、選択したロケールをインストールします。

6
Stefan Majewsky

これに従う リンク 私の問題を解決します:

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

ファイルを生成します/etc/locale.confこの問題を修正します

2
Kokizzu

最近同様の問題が発生し、/etc/rc.confの「LOCALE = en_US.utf8」を誤って削除すると、すべてのUnicodeファイル名が誤って表示されました。だから私はブートスクリプトをチェックしました:

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_LOCALE/etc/rc.confLOCALEの両方をチェックし、最初のものがnoでなく、2番目が空でないことを確認することです。

1
daisy