다음 이전 차례

2. 도대체 로케일(locale)이란 무엇인가?

로케일은 여러분이 여러분의 프로그램 속으로 하드코딩을 해서는 안되는 언어/문 화 관련의 사항을 다룬다. 만약 다양한 로케일을 설치해두었다면 다음 환경 변수 설정을 통하여 로케일을 지원하는 프로그램의 실행 방식을 선택할 수 있다.

기본 로케일은 C 또는 POSIX 이며 libc 에 하드코딩되어 있다.

LANG

이 세팅을 통해 로케일을 설정한다. 하지만 LC_xxxx 환경 변수에 의해 변화될 수 있다.

LC_COLLATE

정렬 순서

LC_CTYPE

문자 정의, 대문자, 소문자,... 이들은 toupper, tolower, islower, isdigit 등의 함수에 사용된다.

LC_MONETARY

금액을 표현하는 형식 정보를 포함하고 있다. 천단위를 구분하는 문자, 소수점 문자, 그리고 금액 표시 문자, 그 위치 등의 정보를 제시한다.

LC_NUMERIC

숫자를 표현함에 있어, 천단위, 소수점, 숫자 그룹핑을 다룬다.

LC_TIME

시간과 날짜의 표현형식을 지정한다. 주와 달에 대한 명칭과 약어를 다룬 다.

LC_MESSAGES

예/아니오 표현

LC_ALL

로케일을 지정한다. 하지만 다른 LC_xxxx 으로 변화될 수 있다. 여기 몇 가지 로케일에 대한 예가 있다.

en_CA

영어권 카나다

en_US

미국 영어권

de_DE

독일의 독일어

fr_FR

프랑스의 프랑스어

여러분이 프로그램을 짜는데 있어 그것이 국제적으로 사용되기 위해서는 로케일 을 이용해야 한다. 가장 중요한 이유 중 하나는 모든 사람이 여러분과 같은 문자 를 사용하지는 않는다는 사실이다. 여러분의 프로그램에서 다음과 같은 식으로 사용하지 말라.

/* check for alphabetic characters */ if ( (( c >= 'a') && ( c <= 'z' )) || (( c >= 'A') && ( c <= 'Z' )) ) { ... }

여러분이 이렇게 모든 화일을 ASCII 화일이라고만 가정하고 만든다면 사용자의 로케일에 따른 코드 페이지 정의를 존중하지 않게 되는 것이다.

예를 들어 독일어 환경에서 쓰이는 움라우프 문자 등이 제외된다고 말할 수 있다. 여러분은 대신 isalpha() 과 같은 로케일 인식 함수를 사용해야 한다. 여러분이 US-ASCII 알파벳 문자만을 요구한다 할 지라도 여전히 isalpha() 함수를 사용하기 바란다. 하지만 우선 setlocalte(LC_TYPE,"C")라고 하든지 아니면 LANG, LC_TYPE, LC_ALL 등의 환경 변수를 "C"로 설정하면 된다. 로케일은 상당한 유연성을 제공하며 프로그래머들이 ASCII 기반의 C 프로그램을 잘못 만들어왔다고 생각한다.

예를 들어 여러분은 문자의 코드 위치를 가정할 수 없다. 여러분은 A 라는 문자의 코드 위치를 0x41 이 아닌 0xC1 으로 정의하는 문자표 화일을 만들 수도 있다. 이것은 메인프레임에서 사용된는 IBM 코드 페이지 37에서의 A 가 갖는 위치이다. 그리고 전자는 바로 US-ASCII, iso8859-x 등에서 사용되고 있는 방식이다. 기본적인 아이디어는 서로 다른 사람들이 다른 언어를 사용하며 정렬 순서도 다르 고 다른 코드 페이지를 사용하며 다른 나라에 살고 있다는 사실로부터 나온다. 바로 로케일과 로케인 인식 프로그램이 그러한 문제에 대한 해결책을 제시하고 있 다. 많은 작업이 필요한 것은 아니고 단지 프로그램 작성시 약간 다른 사고방식을 요구한다.


다음 이전 차례