私は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-gen
のLOCALE=
と/etc/rc.conf
の両方の形式のさまざまな組み合わせを試しましたが、何も問題を解決していません。
追加情報:
% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8
LANG=C
とLC_ALL=en_US.UTF-8
の設定に関するBruce Edigerの提案は機能しました(実際、LC_ALL
を設定すると修正され、LANG
の設定は問題になりませんでした)。何が起こっていますか。 [〜#〜] sus [〜#〜] によると、LC_ALLは、それが設定されていてヌルでない場合、他のすべてのLC_ *変数をオーバーライドします。私のシステムでは設定されていますが、nullなので無視して、代わりに他の値を使用する必要があります。それは何が起こっているのかではありません。アプリケーションがsetlocale
を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)
$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
/etc/locale.conf
を設定した直後に同じ問題が発生しました(/etc/rc.conf
への最近の変更に関して)。私の場合、ロケールがインストールされていないことがわかりました。
/etc/locale.gen
を確認してください。環境変数が参照するすべてのロケールがそこでアクティブ化されている(つまり、コメント化されていない)必要があります。変更を加えたら、Sudo locale-gen
を実行して、選択したロケールをインストールします。
これに従う リンク 私の問題を解決します:
Sudo localectl set-locale LANG=en_CA.UTF-8
# or change to en_US.UTF-8 depends on your locale-gen
ファイルを生成します/etc/locale.conf
この問題を修正します
最近同様の問題が発生し、/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.conf
とLOCALE
の両方をチェックし、最初のものがno
でなく、2番目が空でないことを確認することです。