COM, ATL

lcid 로케일

디버그정 2008. 8. 18. 20:44

스트링은 유니코드를 사용하라.

COM은 내부적으로도 대외적으로도 유니코드를 사용한다. 유니코드는 MBCS(Multi-Byte Code System)와 달리 아시아계 문자 뿐 아니라, 영어권 문자도 2바이트를 사용한다. 이로 인해 아시아계 문자와 영어권 문자의 표현 크기가 틀려서 생기는 코딩의 어려움을 해결할 수 있다.

유니코드는 프로그래머의 편의보다도, 전세계 문자를 하나의 코드체계에 포함시킨 것에 더 큰 의미를 가지고 있다. COM 인터페이스는 잘 정의된다면 전세계적으로 통용되는 것이다. 따라서 스트링의 표현을 유니코드로 하는 것은 자연스러운 일이다.

Visual C++에서 유니코드 문자 데이타는 WCHAR 혹은 OLECHAR 타입으로 정의되어 있다. 또한 리터럴(literal)을 유니코드로 지정할 경우 OLESTR 매크로를 사용한다. 그 외에도 유니코드에서 MBCS, 혹은 그 반대로 변환하는 함수로서 wcstombs, mbstowcs와 같은 함수들이 있다.

스트링을 리턴할 경우 로케일을 고려하라.

로케일(locale)은 사용언어마다 다른 설정을 의미한다. 만일 커스텀 인터페이스가 스트링을 리턴해야 한다면, 과연 어떤 언어로 리턴할 것인가? 일반적으로 영어를 사용할 수도 있지만, 상품성을 위해서 한국어나 일본어도 지원할 수 있으면 좋을 것이다.

그러나 이를 위해서 한국어 버전의 COM클래스, 영어 버전의 COM클래스를 따로 만들 필요는 없다. WIN32에서 로케일에 관한 ID를 LCID라는 타입으로 정리해두었기 때문에 이를 인자로 받아서 LCID에 해당하는 스트링을 리턴하면 된다.


<그림 2> LCID의 구성

LCID는 <그림 2>와 같이 구성되어 있다. 정렬 ID는 정렬(sorting)을 어떻게 할 것인지를 지정하고, 주 언어코드와 부 언어코드는 실제로 사용할 언어코드를 지정한다. 주언어코드와 부언어코드를 합친 16비트를 LANGID라고도 한다.

WIN32는 LCID를 다루기 위한 마크로들이 제공한다. 이것들은 LCID를 만드는 MAKELCID, LCID로부터 LANGID를 뽑아내는 LANGIDFROMCLSID, LANGID로부터 주언어코드와 부언어코드를 얻어내는 PRIMARYLANGID와 SUBLANGID마크로 들이다. 그외에도 디폴트 LANGID를 얻기 위한 API로 GetSystemDefaultLangID와 GetUserDefaultLangID를 제공한다.

정렬코드와 주언어/부언어 코드는 Visual C++의 <olenls.h>에 정의되어 있으므로 참고하기 바란다