리눅스 기반의 OS 에서 개발을 진행하다 보면 한글의 인코딩 문제로 에러가 나는 경우가 있다. 파이썬으로 개발을 하던 도중 한글명의 파일을 다룰 때 ascii encoding 과 관련된 에러가 발생했다. 파이썬의 encoding 설정을 확인하기 위해서 sys 모듈의 메서드를 확인했는데, getdefaultencoding() 을 호출하는 경우 utf8 로 설정되어 있지만 getfilesystemencoding() 을 호출하는 경우 ascii 로 되어있는 것을 확인하였다. 이로 인해서 filesystem 의 encoding 설정을 바꾸는 방법을 찾아보았다.
1. locale
locale 은 리눅스 명령어이자 사전적으로 장소, 지역 등을 의미한다. 지역에 따라서 해당 코드의 세트, 날짜 및 시간 형식 지정 규약, 통화 규약, 십진수 형식 지정 규약, 정렬 순서 등등이 달라질 수 있기 때문에 OS 에서는 이와 관련된 환경변수를 통해서 해당 locale 에서의 표현 형식을 지정한다.
2. locale 형식
locale 은 일반적으로 다음의 형식을 따른다.
language[_territory][.codeset][@modifier]
각 언어와 이를 처리하는 인코딩 코드셋에 따라서 locale 값이 지정되는데 대표적으로는 'en_US.UTF-8'. 'ko_KR.UTF-8' 등이 있다. 'en_US.UTF-8' 은 영어, 미국, UTF-8 인코딩을 의미하고, 'ko_KR.UTF-8' 은 한글, 한국, UTF-8 을 의미한다. 이외에도 POSIX 나 C, C.UTF-8 과 같은 로케일이 리눅스 기본값으로 지정되어 있는 경우도 있다.
3. locale 명령어
터미널에서 locale 명령어를 치면 locale 과 관련된 환경 변수의 값들을 확인할 수 있다.
LANG="ko_KR.UTF-8"
LC_COLLATE="ko_KR.UTF-8"
LC_CTYPE="ko_KR.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=
위의 설정은 모두 한글과 UTF-8 인코딩을 따르도록 설정되어 있다.
각 설정들의 설명은 다음과 같다.
환경변수명 | 설명 |
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 등 추가적인 환경변수들도 있다.
locale 명령어에 -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
...
4. locale 환경변수의 우선순위
locale 환경변수로 설정을 하는 경우 우선순위에 따라서 값이 적용된다.
가장 우선순위가 높은 값은 LC_ALL 이고 제일 우선순위가 낮은 값은 LANG 이다. 그리고 둘 사이에 나머지 카테고리들이 위치한다. 그렇기 때문에 LANG 을 지정하더라도 LC_ALL 이 다른 값으로 지정되어 있는 경우에는 LC_ALL 에 지정된 값을 기준으로 동작하게 된다.
[reference]
- https://redjacob.tistory.com/17
- https://www.44bits.io/ko/keyword/locale
'Tech > Linux' 카테고리의 다른 글
[Linux] 사용자 권한 (sudo, sudoers, chmod, chown) (2) | 2023.11.28 |
---|---|
[Linux] 사용자 계정 생성 (adduser, useradd) (1) | 2023.11.26 |
[Linux] df (0) | 2022.06.06 |
[Linux] PID, PPID (0) | 2022.01.08 |
[Linux] scp (secure copy) (0) | 2021.10.16 |