ほとんどすべてのプログラムが私のロケールについて文句を言うのはなぜですか?


29

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

Bruce Edigerの設定LANG=Cと提案の提案LC_ALL=en_US.UTF-8(実際、設定はLC_ALL修正されましたが、設定LANGは重要ではありませんでした)が、何が起こっているのか知りたいです。SUSによると、LC_ALLは、nullではなく設定されている場合、他のすべてのLC_ *変数をオーバーライドします。私のシステムでは設定されていますが、nullであるため、無視する必要があり、代わりに他の値を使用する必要があります。それは起こっていることではありません。他の呼び出しが適切な文字列を返す場合でも、アプリケーションはを呼び出しsetlocaleLC_ALLNULL戻ってきて、エラーを生成しているよう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)  

の出力を共有できますlocale -aか?
njsg

私はあなたが使用する必要があることをポイントに行っていた.utf8LOCALEしてLC_*、どうやら.UTF-8ここにも動作します... EN-USについて:それは(せずに表示されない.utf8)にlocale -a
njsg

1
やるexport LANG=Cexport LC_ALL=en_US.UTF-8何が起こるか見てください。私のArch LinuxラップトップはLOCALE="en_US.UTF-8"/etc/rc.confにあり、ラップトップがどこにLANG = Cを設定しているかわかりません。
ブルースエディガー

あなたのコンテンツを投稿できます/etc/locale.confか?(アンダースコアではLANG=en-USなく)誤って(ハイフンで)書いたようですLANG=en_US
ミケル

の内容/etc/locale.genも便利です。
ミケル

回答:


18

あなたは非存在下でのロケールをデフォルトに使用されるファイル逃している$LANG$LC_ALL(またはすべてのより具体的なのが$LC_whatever設定されています)。

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

strace -eファイルのロケール
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」はsyscallを表示するため、問題ないはずです。

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

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

その場合、システム全体のデフォルトを設定して、次のようなもので問題を解決するはずです。

localedef -f UTF-8 -i en_US en_US.UTF-8

sudo localedef -f UTF-8 -i en_US en_US.UTF-8Raspbian 2018-11-13 Liteで動作します。
Ciro Santilli新疆改造中心法轮功六四事件

6

/etc/locale.conf今日のセットアップ後に同じ問題が発生しました(に対する最近の変更に関するもの/etc/rc.confです。私の場合、ロケールがインストールされていないことが判明しました。

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


2

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

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

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


1

最近似たような問題が発生しました。誤って 'LOCALE = en_US.utf8'を削除したときに、すべてのUnicodeファイル名が誤って表示されました/etc/rc.conf。そこで、ブートスクリプトを確認しました。

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_LOCALELOCALEして/etc/rc.conf、必ず最初のものはありませんでし作るno2つ目は空にされませんでした。


-1

たぶんあなたの設定の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=
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.