Create TOC

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 계열)