로케일(Locale)이란? 국가 및 언어 설정
로케일(Locale)이란?
로케일은 사용자 인터페이스에서 사용되는 언어, 지역 설정, 출력 형식 등을 정의하는 문자열입니다. 유닉스Unix와 리눅스Linux와 같은 POSIX 기반의 시스템에서는 같은 형식을 공유하고 있습니다. 애플의 맥OS를 비롯한 Darwin 계열 운영체제들도 POSIX 호환이 되기 때문에 같은 형식의 로케일 문자열을 사용합니다.
로케일과 관련된 환경변수들을 설정함으로서 로케일 설정을 변경할 수 있으며, 이 설정값에 따라서 프로그램이 지원하는 경우 메시지, 시간 형식, 통화 형식 등의 출력이나 동작을 변경할 수 있습니다. 로케일 설정은 특정 언어의 입출력에 영향을 주는 경우가 있어서, 영어 이외의 언어를 사용하는 경우 적절한 값을 지정해야합니다.
로케일 형식 이해하기
로케일은 일반적으로 다음 형식을 따릅니다.
language[_territory][.codeset][@modifier]
한국어를 사용하는 경우 ko_KR.UTF-8
를 주로 사용합니다.
이 때 맨 앞의 ko
는 한국어(한글)을 의미하며, 이 값은 ISO 639-1 표준 형식을 따릅니다. 두 번째로 언더바로 구분되는 KR
값은 지역을 의미하며 ISO 3166-1 표준 형식을 따릅니다. 마지막으로 점으로 구분되는 코드셋에는 EUC-KR이나 UTF-8과 같은 문자 인코딩 코드셋을 지정해줍니다. C
나 POSIX
와 같이 특별한 의미로 해석되는 로케일 값도 있지만, 일반적으로 이렇게 세 개의 값을 묶어서 하나의 로케일을 구성하게됩니다. 이 뒤로 @
로 구분되는 추가 문자열이 붙는 경우도 있지만 자주 사용되지는 않습니다.
즉, ko_KR.UTF-8
는 한국어, 한국, UTF-8 인코딩을 의미합니다. 한국어(ko)의 경우 한국(KR)과 함께 사용하는 경우가 대부분입니다만, 영어의 경우 국가에 종속되지 않기 때문에 다음과 같이 여러 조합으로 사용되곤 합니다.
-
en_US.UTF-8
: 영어, 미국, UTF-8 인코딩 -
en_CA.UTF-8
: 영어, 캐나다, UTF-8 인코딩 -
en_GB.UTF-8
: 영어, 영국, UTF-8 인코딩 -
en_HK.UTF-8
: 영어, 홍콩, UTF-8 인코딩
이외에도 POSIX
나 C
, C.UTF-8
과 같은 로케일이 리눅스 기본값으로 지정되어있는 경우도 있습니다.
locale 명령어
셸에서는 locale
명령어를 사용해 현재 시스템에 적용되어있는 로케일 값을 확인할 수 있습니다.*
* GUI 환경에서는 별도의 로케일 값이 설정될 수 있습니다. 일반적으로 시스템 설정의 국가 및 언어를 설정하는 곳에서 로케일을 확인 및 변경할 수 있습니다.
$ locale
LANG=""
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
위의 출력결과에서 알 수 있듯이, locale
명령어를 인자없이 실행하면, 로케일과 관련된 현재 설정값을 보여줍니다.
- LC_ALL
- 전역 로케일 설정값입니다. 우선순위가 가장 높습니다.
- LANG
- 전역 로케일 설정값입니다. 다른 값이 설정되어있지 않을 때만 적용되며, 우선순위가 가장 낮습니다.
- LC_MESSAGES
- 메시지를 표시하는 기준이 되는 로케일을 지정합니다.
- LC_CTYPE
- 문자 분류, 글자수, 대소문자 구분이 되는 로케일을 지정합니다.
- LC_NUMERIC
- 숫자와 관련된 기준이 되는 로케일을 지정합니다.
- LC_MONETARY
- 통화나 금액과 관련된 숫자의 기준이 되는 로케일을 지정합니다.
- LC_TIME
- 날짜, 시간과 관련된 로케일을 지정합니다.
- LC_COLLATE
- 문자열의 정렬 순서를 결정하는 로케일을 지정합니다.
이 외에도 시스템에 따라 LC_PAPER
, LC_NAME
, LC_ADDRESS
, LC_TELEPHONE
, LC_MEASUREMENT
, LC_IDENTIFICATION
등 추가적인 환경변수들도 있습니다. 로케일은 라이브러리나 프로그램 동작 방식 등에 영향을 줄 수 있습니다만, 라이브러리와 프로그램에서 지원해야만 의도한대로 동작하므로 실제 프로그램 별 동작 방식에 대해서는 별도로 확인이 필요합니다.
또한 -a
옵션으로 현재 시스템에서 사용가능한 모든 로케일을 확인할 수 있습니다.
$ locale -a
en_NZ
nl_NL.UTF-8
pt_BR.UTF-8
fr_CH.ISO8859-15
eu_ES.ISO8859-15
en_US.US-ASCII
...
로케일 환경변수의 우선순위
앞에서 살펴보았듯이 로케일을 설정하는 다양한 환경변수가 있습니다. 간단한 예제를 통해서 이 환경변수들의 우선순위에 대해서 알아보겠습니다. 먼저 우선순위가 가장 낮은 환경변수는 LANG
입니다. export
를 사용해 LANG
환경변수를 ko_KR.UTF-8
로 설정해보겠습니다.*
* 이 예제는 맥OS 카탈리나에서 테스트 되었습니다. 시스템에 따라서 결과가 조금씩 다를 수 있습니다.
$ export LANG='ko_KR.UTF-8'
$ locale
LANG="ko_KR.UTF-8"
LC_COLLATE="ko_KR.UTF-8"
LC_CTYPE="UTF-8"
LC_MESSAGES="ko_KR.UTF-8"
LC_MONETARY="ko_KR.UTF-8"
LC_NUMERIC="ko_KR.UTF-8"
LC_TIME="ko_KR.UTF-8"
LC_ALL=
LANG 값만 설정했습니다만, LC_ALL
을 제외한 로케일 관련 환경변수의 값들이 한꺼번에 변경된 것을 확인할 수 있습니다. 그리고 date
명령어를 실행해봅니다.
$ date
2021년 3월 7일 일요일 19시 07분 11초 KST
결과가 한글로 나오는 것을 확인할 수 있습니다. 이번에는 LC_TIME
값을 zh_CN.UTF-8
으로 설정해보겠습니다.
$ export LC_TIME='zh_CN.UTF-8'
$ locale
LANG="ko_KR.UTF-8"
LC_COLLATE="ko_KR.UTF-8"
LC_CTYPE="UTF-8"
LC_MESSAGES="ko_KR.UTF-8"
LC_MONETARY="ko_KR.UTF-8"
LC_NUMERIC="ko_KR.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_ALL=
LC_TIME
환경변수 값만 변경된 것을 확인할 수 있습니다. 이 상태에서 date
명령어를 실행해 날짜를 출력해보겠습니다.
$ date
2021年 3月 7日 星期日 19时09分38秒 KST
중국어로 출력되는 것을 확인할 수 있습니다. 이번에는 LC_ALL
값을 de_DE.UTF-8
로 설정해봅니다.
$ export LC_ALL='de_DE.UTF-8'
$ locale
LANG="ko_KR.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_CTYPE="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_ALL="de_DE.UTF-8"
LANG을 제외한 모든 값이 de_DE.UTF-8
로 덮어씌워진 것을 알 수 있습니다.
$ date
So 7 Mär 2021 19:11:34 KST
이 상태에서 date
명령어를 실행하면 독일어로 날짜가 출력됩니다. 참고로 LC_ALL
값이 설정된 상태에서는 개별 로케일 환경변수 값을 변경해도 바뀌지 않습니다.
이를 통해서 로케일 환경변수의 우선순위에 대해서 파악해볼 수 있습니다. 먼저 우선순위가 가장 높은 값은 LC_ALL
입니다. 그 다음은 LC_
로 시작하는 개별 로케일 설정을 위한 환경변수들입니다. 마지막으로 LANG
입니다. 특정 로케일을 사용한다면 LC_ALL
만 설정하면 되고, 특정 설정값에 대해서만 로케일을 변경이 필요한 경우에는 LANG
으로 기본값을 설정하고 필욯나 LC_*
값을 설정해서 사용할 수 있습니다. 조금 헷갈릴 수 있습니다만 LC_ALL
이 LANG
보다 높다는 정도만 기억해놔도 도움이 될 것입니다.*
* 단순히 출력 메시지 언어만 변경하고자 하는 경우 LANGUAGE
환경변수에 언어 코드만 지정하는 방법도 있습니다. 이 환경변수는 :
를 구분자로 여러개의 언어를 지정할 수 있습니다.
셸 설정 파일에 기본 로케일을 설정해두면 편리합니다.
로케일 설치하기
일반적인 리눅스나 맥OS 환경의 경우 자주 사용되는 로케일이 설치되어있습니다. 하지만 도커 이미지와 같이 최소화된 환경에서는 로케일이 기본적으로 설치되어있지 않습니다. 예를 들어 ubuntu:20.04
이미지에서 locale -a
를 실행해보면 C
와 POSIX
로케일밖에 없는 것을 확인할 수 있습니다.
$ docker run -it ubuntu:latest bash
root@a4365005d20a:/# locale -a
C
C.UTF-8
POSIX
사용하고자 하는 로케일이 없는 경우에는 locale-gen이나 localedef를 사용해 로케일을 추가하고 사용할 수 있습니다. 더 자세한 내용은 다음 글을 참고해주세요.