Linux에서 로케일이 어떻게 작동하는지 이해하려고 합니다. 나는 이것이 다음과 같이 작동한다고 생각합니다.
각 프로세스에는 환경 변수 테이블이 있습니다. 프로세스를 시작하고 일부 로케일 변수(예: LC_ALL=en_US.UTF-8
)를 사용하여 해당 프로세스에 대한 일부 환경 변수를 설정할 수 있습니다.
그러나 새로 시작된 이 프로세스가 해당 로캘 변수가 무엇인지 확인하려는 경우 환경 변수 테이블을 보지 않고 대신 다음과 같이 별도의 로캘 변수 테이블을 봅니다.
따라서 프로세스가 환경 변수 테이블에 설정된 로케일 변수를 사용하려면 먼저 이를 로케일 변수 테이블에 복사해야 합니다. 예를 들어, LC_ALL
환경 변수 테이블의 변수를 로케일 변수 테이블로 복사하기 위해 프로시저는 다음을 수행합니다.
setlocale (LC_ALL, "");
내 이해가 맞나요? 내 말이 맞다면 모든 프로세스에 로케일 변수 테이블이 있습니까, 아니면 테이블이 C로 작성된 프로그램에만 존재합니까?
답변1
귀하의 이해는 부분적으로 정확하지만 부분적으로만 정확합니다. 당신이 놓친 것 중 하나는 로케일을 사용하는 방법입니다. 로케일은 메시지 번역( 사용 LC_MESSAGES
), 숫자 LC_NUMERIC
및 날짜 형식 지정( ) LC_TIME
, 텍스트 인코딩 및 디코딩( LC_CTYPE
), 텍스트 정렬( LC_COLLATE
) 등과 같은 로케일 관련 작업을 수행하는 다양한 라이브러리 함수에서 사용됩니다.
날짜 형식을 지정하는 함수를 예로 들어 보겠습니다. 로캘 종속 형식이 필요한 경우 현재 프로세스에서 사용하도록 구성된 로캘에서 날짜 형식에 대한 규칙을 찾습니다. 날짜 형식은 로케일 이름에 신경 쓰지 않으며 날짜 형식을 지정하는 방법만 알아야 합니다. 따라서 "로케일 테이블"이라고 부르는 것을 살펴보는 동안 해당 테이블에는 이름(예: LC_TIME
is fr_FR
)이 아니라 설정(예: "간단한 날짜 형식은 일-월-연도 순서를 사용하고, 긴 날짜 형식은 월 이름을 사용합니다 janvier
. février
...").
C 함수는 setlocale
프로세스의 로케일 테이블에 일부 항목을 채웁니다. 두 개의 매개변수, 즉 채울 카테고리와 문자열이 필요합니다.이름이러한 로케일에 특정 값을 지정하십시오. 이 문자열은 기본적으로 설정이 로드되는 파일 이름입니다. 예를 들어, setlocale(LC_TIME, "fr_FR")
이는 기본적으로 "파일의 날짜 형식을 프로세스의 로케일 테이블로 로드 /usr/share/i18n/locales/fr_FR
"하는 것을 의미합니다(이보다 더 복잡하고 다른 파일도 포함되지만 이것이 기본 아이디어입니다).
C 함수에는 setlocale
환경 변수를 찾는 작동 모드가 있습니다. 이름 대신 빈 문자열을 지정하면 다음을 기반으로 합니다.로캘 환경 변수 계층 구조. 대부분의 프로그램은 이 모드를 사용합니다. 다시 말하지만, 환경 변수와 로케일 이름은 setlocale
로케일 관련 작업을 수행하는 함수가 작동하는 방식이 아니라 작동 방식에 영향을 미칩니다.
로케일 테이블은 libc
작성된 언어에 관계없이 거의 모든 프로그램이 링크되는 표준 라이브러리( )의 기능입니다. 대부분의 언어에서는 setlocale
표준 라이브러리 함수를 호출하여 설정하는 방법을 제공합니다. 예를 들어 Perl과 Python에는 모두 setlocale
C와 유사한 기능이 있습니다. 고급 언어도 Perl과 같이 환경을 기반으로 로케일을 설정하는 경우가 많습니다 . use locale
bash에서는 자동으로 설정되지만 로케일은 환경이 아닌 동일한 이름의 쉘 변수를 기반으로 합니다. LC_COLLATE
설정되지 않은 경우, 예를 들어 설정은 bash Impact에서 설정됩니다 export
.