거의 모든 프로그램이 내 로케일에 대해 불평하는 이유는 무엇입니까?

거의 모든 프로그램이 내 로케일에 대해 불평하는 이유는 무엇입니까?

나는 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 줄에는 locale-gen실행 시 표시되는 "something.UTF-8"이 있지만 사용 가능한 로케일이 표시되어야 합니다. 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같습니다 .NULLsetlocale

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)  

답변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 (해당 파일이나 디렉터리 없음)
open("/etc/ld.so.cache", O_RDONLY) = 3
오픈("/lib/libc.so.6", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY | O_LARGEFILE) = 3

-------------1일 후 댓글이 추가되었습니다.

ltrace -S시스템 호출을 표시하므로 괜찮습니다.

strace그렇지 않으면 "ltrace" 는 상위 호출만 표시하므로 별로 도움이 되지 않습니다(즉, 에 비해 비생산적입니다 ). 이것들은 명백하다( 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=

관련 정보