
我正在使用 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... 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
布魯斯·艾迪格(Bruce Ediger)的設置建議LANG=C
有效LC_ALL=en_US.UTF-8
(事實上,設置LC_ALL
修復了它,設置LANG
並不重要),但我想知道發生了什麼。根據不銹鋼,如果設定了 LC_ALL 且不為空,則 LC_ALL 將覆寫所有其他 LC_* 變數。在我的系統中,它被設定了,但它是空的,所以應該忽略它,而應該使用其他值。事實並非如此,應用程式似乎正在呼叫setlocale
、LC_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=