為什麼幾乎每個程式都抱怨我的區域設定?

為什麼幾乎每個程式都抱怨我的區域設定?

我正在使用 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會顯示,但是,它應該顯示可用的區域設定顯示。我已經嘗試了 in和in兩種格式的各種組合,但沒有解決問題。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

布魯斯·艾迪格(Bruce Ediger)的設置建議LANG=C有效LC_ALL=en_US.UTF-8(事實上,設置LC_ALL修復了它,設置LANG並不重要),但我想知道發生了什麼。根據不銹鋼,如果設定了 LC_ALL 且不為空,則 LC_ALL 將覆寫所有其他 LC_* 變數。在我的系統中,它被設定了,但它是空的,所以應該忽略它,而應該使用其他值。事實並非如此,應用程式似乎正在呼叫setlocaleLC_ALL獲取NULL返回值並產生錯誤,即使其他呼叫setlocale返回一個好的字串也是如此。

ltrace這是of 的頂部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 vars */]) = 0
access("/etc/ld.so.preload", R_OK) = -1 ENOENT(沒有這樣的檔案或目錄)
開啟(“/etc/ld.so.cache”,O_RDONLY)= 3
開啟(“/lib/libc.so.6”,O_RDONLY)= 3
開啟(“/ 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

也許您的其中一項設定無效?這些是我的區域設置供參考;它們不會導致任何錯誤(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=

相關內容