Create TOC

2003년 3월 8일

wide character (wchar_t)

wchar_t

wide character란 1바이트가 아닌 그 이상의 바이트를 차지하는 정수에 저장되는 문자 코드를 의미한다. 즉 유니코드를 말한다.

C 표준은 wide character를 표현하기 위해 wchar_t 데이터 형을 정의하고 있다. 그러나 표준에서 정확한 형식을 정의하지 않은 이유로 컴파일러 구현마다 정의가 다르다.

MSVC 경우 unsigned short를 사용한다. 즉 UCS-2를 나타낸다.(UTF-16과는 다르다고 한다.). MSVC 경우 Unicode API에서는 WCHAR를 사용하는데 정의 상 wchar_t와 동일하다.(unsigned short)

gcc 경우에는 int를 사용하며 UCS-4를 나타낸다. MSVC와 동일하게 사용하려면 -fshort-wchar 옵션을 주면 된다. 그러나 이렇게 변경했을 경우 C 표준 라이브러리들이 제대로 동작할지는 알 수 없다.

이런 모호한 이유로 wchar_t를 사용할 때는 해당 시스템의 매뉴얼(msdn이던 man page던)을 읽고 사용하는 수밖에는 없다.

wint_t

char을 위한 wchar_t가 있다면 int를 위한 wint_t가 있다.

C 표준 라이브러리를 보면 문자를 다루는 함수들은 char 대신 int를 사용한다(이유를 알고 있었는데 잊었다).

이런 함수들의 unicode 버전은 wint_t를 사용한다.

주의할 점은 ansi 세계에서 문자열 표현을 위해서 int 배열을 쓰지 않는 것처럼 unicode 세계에서도 문자열 표현을 위해서 wint_t를 사용하지 않는다는 점이다(wchar_t를 사용한다).

unicode string literal

C 표준에서 unicode string literal은 아래와 같은 방법으로 표현하도록 정의되어 있다.

wchar_t wtext[] = L"Hello";

그런데 이때 gcc와 MSVC의 동작이 다르다. MSVC는 시스템 기본 로케일을 기준으로 UCS-2로 변환하지만(즉 컴파일하는 시점의 시스템 설정에 따라 다르다), gcc 경우 소스 파일의 각 byte를 하나씩 wchar_t에 복사하고 있다. 즉 소스가 영문 ascii라고 전제하고 UTF-32로 변환한다.