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


29

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... done있지만 locale -a사용 가능한 로케일 쇼가 표시 en_US.utf8됩니다. in /etc/locale-genLOCALE=in 형식의 다양한 조합을 시도했지만 /etc/rc.conf문제를 해결 한 것은 없습니다.

추가 정보:

% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8

Bruce Ediger의 설정 LANG=CLC_ALL=en_US.UTF-8작업 제안 (사실 설정 LC_ALL, 설정 LANG은 중요하지 않음), 무슨 일이 일어나고 있는지 알고 싶습니다. 에 따르면SUS LC_ALL은 다른 모든 LC_ * 변수가 설정되고 널이 아닌 경우이를 대체합니다. 내 시스템에서는 설정되어 있지만 null이므로 무시하고 다른 값을 대신 사용해야합니다. 즉, 응용 프로그램이 호출하는 것 같다, 무슨 일이 아니다 setlocale으로 LC_ALL하는 점점 NULL다른 통화 할 경우에도 다시 및 오류를 생성 setlocale좋은 문자열을 반환합니다.

여기 상단이다 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)  

출력을 공유 할 수 locale -a있습니까?
njsg

나는 당신이 and .utf8에서 사용해야한다고 지적하려고 했지만 분명히 여기에서도 작동합니다 ... en-US의 경우 : (없이 )에 나타 납니까? LOCALELC_*.UTF-8.utf8locale -a
njsg

1
수행 export LANG=Cexport LC_ALL=en_US.UTF-8어떻게되는지. 내 아치 리눅스 랩톱은 LOCALE="en_US.UTF-8"/etc/rc.conf에 있으며 랩톱이 LANG = C로 설정되어있는 곳을 알 수 없습니다.
Bruce Ediger

의 내용을 게시 할 수 있습니까 /etc/locale.conf? 실수 LANG=en-USLANG=en_US(밑줄 포함) 대신 ( 하이픈으로) 쓴 것 같습니다 .
Mikel

그리고 그 내용 /etc/locale.gen도 유용 할 것입니다.
Mikel

답변:


18

$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
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'을 제거했을 때 모든 유니 코드 파일 이름이 잘못 표시되었습니다 /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_LOCALE하고 LOCALE/etc/rc.conf, 확실히 처음이 아니었다하게 no하고, 두 번째가 비어 있지되었다.


-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.