로케일(Locale)이란? 국가 및 언어 설정

로케일(Locale)이란?

로케일은 사용자 인터페이스에서 사용되는 언어, 지역 설정, 출력 형식 등을 정의하는 문자열입니다. 유닉스Unix와 리눅스Linux와 같은 POSIX 기반의 시스템에서는 같은 형식을 공유하고 있습니다. 애플의 맥OS를 비롯한 Darwin 계열 운영체제들도 POSIX 호환이 되기 때문에 같은 형식의 로케일 문자열을 사용합니다.

로케일과 관련된 환경변수들을 설정함으로서 로케일 설정을 변경할 수 있으며, 이 설정값에 따라서 프로그램이 지원하는 경우 메시지, 시간 형식, 통화 형식 등의 출력이나 동작을 변경할 수 있습니다. 로케일 설정은 특정 언어의 입출력에 영향을 주는 경우가 있어서, 영어 이외의 언어를 사용하는 경우 적절한 값을 지정해야합니다.

44BITS 소식과 클라우드 뉴스를 전해드립니다. 지금 5,000명 이상의 구독자와 함께 하고 있습니다 📮

로케일 형식 이해하기

로케일은 일반적으로 다음 형식을 따릅니다.

language[_territory][.codeset][@modifier]

한국어를 사용하는 경우 ko_KR.UTF-8를 주로 사용합니다.

ko_KR.UTF-8 로케일의 의미

이 때 맨 앞의 ko는 한국어(한글)을 의미하며, 이 값은 ISO 639-1 표준 형식을 따릅니다. 두 번째로 언더바로 구분되는 KR 값은 지역을 의미하며 ISO 3166-1 표준 형식을 따릅니다. 마지막으로 점으로 구분되는 코드셋에는 EUC-KR이나 UTF-8과 같은 문자 인코딩 코드셋을 지정해줍니다. CPOSIX와 같이 특별한 의미로 해석되는 로케일 값도 있지만, 일반적으로 이렇게 세 개의 값을 묶어서 하나의 로케일을 구성하게됩니다. 이 뒤로 @로 구분되는 추가 문자열이 붙는 경우도 있지만 자주 사용되지는 않습니다.

즉, ko_KR.UTF-8는 한국어, 한국, UTF-8 인코딩을 의미합니다. 한국어(ko)의 경우 한국(KR)과 함께 사용하는 경우가 대부분입니다만, 영어의 경우 국가에 종속되지 않기 때문에 다음과 같이 여러 조합으로 사용되곤 합니다.

이외에도 POSIXC, 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_ALLLANG보다 높다는 정도만 기억해놔도 도움이 될 것입니다.*

* 단순히 출력 메시지 언어만 변경하고자 하는 경우 LANGUAGE 환경변수에 언어 코드만 지정하는 방법도 있습니다. 이 환경변수는 :를 구분자로 여러개의 언어를 지정할 수 있습니다.

셸 설정 파일에 기본 로케일을 설정해두면 편리합니다.

로케일 설치하기

일반적인 리눅스나 맥OS 환경의 경우 자주 사용되는 로케일이 설치되어있습니다. 하지만 도커 이미지와 같이 최소화된 환경에서는 로케일이 기본적으로 설치되어있지 않습니다. 예를 들어 ubuntu:20.04 이미지에서 locale -a를 실행해보면 CPOSIX 로케일밖에 없는 것을 확인할 수 있습니다.

$ docker run -it ubuntu:latest bash
root@a4365005d20a:/# locale -a
C
C.UTF-8
POSIX

사용하고자 하는 로케일이 없는 경우에는 locale-gen이나 localedef를 사용해 로케일을 추가하고 사용할 수 있습니다. 더 자세한 내용은 다음 글을 참고해주세요.

'도커(Docker) 컨테이너 로케일 설정: 데비안(Debian), 우분투(Ubuntu) 이미지에서 한글 입력 문제' 대표 이미지

도커(Docker) 컨테이너 로케일 설정: 데비안(Debian), 우분투(Ubuntu) 이미지에서 한글 입력 문제

🗒 기사, 2018-07-12 - 도커 우분투, 데비안 이미지에서는 기본적으로 한글 입력을 지원하지 않습니다. 한글을 입력하기 위해서는 로케일 설정을 UTF-8로 지정할 필요가 있습니다. 이 글에서는 로케일 개념과 함께 도커 이미지/컨테이너에서 로케일을 적용하는 방법에 대해서 소개합니다.

같이 읽으면 좋은 문서들