나는 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... 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
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 -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=