Create TOC

레이블이 Unicode인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Unicode인 게시물을 표시합니다. 모든 게시물 표시

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로 변환한다.

2002년 10월 20일

Win32/Unicode Programming

Unicode 로 작성된 program의 동작 되지 않는 OS

  • Windows 95
  • Windows 98작동을 위하여서는 Windows program install이 필요함.

TCHAR의 형태를 활용한다.

UNICODE와 MBCS에서 같은 Source를유지하기 위하여 tchar.h의 TCHAR를 활용한다.

변경 전변경 후
charTCHAR
unsigned charTBYTE
char str[] = "test string"TCHAR str[] = TEXT("test string")

함수를 변경한다.

변경 전변경 후
strlen()_tcslen() * sizeof(TCHAR)
strcat()_tcscat()
strcpy()_tcscpy()
str...()_tcs...()

Unicdoe define 설정방법

_MBCS대신에 _UNICODE를 정의 한다. 일부 crt 프로그램의 경우 UNICODE define을 추가로 필요로 한다. MFC에서는 _UNICODE나 UNICODE중 하나만 define되어 있으면 된다.

MFC Application Unicode compile경우 link " _WinMain@16"의 Error가 발생한다.

Link->Output에서 Entry-point symbol 을 미지정 상태에서 ""에서 "wWinMainCRTStartup"으로 설정한다.

함수의 인자가 char*인경우

GetProcAddress(HMODULE, LPCSTR) 에서 두번째의 인자는 LPCSTR이므로 _T("")를 사용하지 않는다.

::GetProcAddress(hModuel, _T("function name"));  // no
::GetProcAddress(hModuel, "function name");      // ok

TCHAR의 형태를 지원하지 않는 함수 목록

atof (atoi, atol은 지원)

Unicode text file

unicode로 text파일을 만들때 편집기에 따라서 파일의 처음 부분에 2byte가 BOM 값을 가지는 경우가 있다. 따라서 text파일을 처리할 때 BOM 처리에도 주의해야 한다.

특별한 처리 없이 BOM이 있는 파일을 ftscanf 계열의 함수를 사용해서 처리하면 Unicode compile에서는

  • MBCS text 파일을 읽을경우 -> Unicode로 변경하여 read (O)
  • Unicode text 파일을 읽을경우 -> Unicode로 read (O)

MBCS compile에서는

  • MBCS text 파일을 읽을경우 -> MBCS로 read (O)
  • Unicode text 파일을 읽을경우 -> 잘못된 읽기(처음 한자만 읽고 다음 글자를 null로 인식하여, 한자만 읽힌다.)

결국 BOM이 포함된 text 파일을 다룰 경우 Unicode compile을 하는 것이 좋다.

9X 지원의 여부

9x에서는 Unicode 지원에 문제가 있다. 대부분의 Unicode 함수는 compile과 실행이 되나 return값이 FALSE가 나온다. 공통의 code에서는 LoadStringW(), CreateRegistryW()등이다. (windows api 계열)

wstrcpy()는 정상 동작한다. (c run-time 계열)