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

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

저는 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표시되지만 사용 가능한 로케일을 표시하는 는 표시됩니다 . 와 에서 두 형식을 다양하게 조합해 보았 으나 문제가 해결되지 않았습니다.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중요하지 않았습니다) 무슨 일이 일어나고 있는지 알고 싶습니다. 에 따르면SUS, LC_ALL은 다른 모든 LC_* 변수가 설정되어 있고 null이 아닌 경우 재정의됩니다. 제 시스템에서는 설정되어 있지만 null이므로 무시하고 대신 다른 값을 사용해야 합니다. 그것은 무슨 일이 일어나고 있는지가 아닙니다. 다른 호출이 좋은 문자열을 반환 하는 경우에도 응용 프로그램이 호출 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 (해당 파일이나 디렉터리가 없음)
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 -Ssyscall을 표시하므로 괜찮습니다.

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=

관련 정보