볼거리/Book

[펌] MultiBytetoWideChar의 사용법

NGVI 2008. 8. 2. 18:59
 

해당 함수는 ANSI 코드 -> Unicode로 변환하는 API 루틴이다

MSDN을 주의깊게 읽지 않으면 다음과 같은 실수를 할수 있다.



WCHAR converted[64];


MultiBytetoWideChar(CP_ACP, 0, original, -1 converted, sizeof(converted));




MultiBytetoWideChar의 6번째 인자는 출력버퍼의 Unicode 글자수이다.


sizeof(converted)가 64가 아니라 128이라는 점을 유의해야 한다.


해당함수는 Unicode로 128글자까지 쓰기시도하므로  버퍼 오버런이 발생할수 있다.



======================================================================================



int MultiByteToWideChar (UINT CodePage,

DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte,

LPWSTR lpWideCharStr, int cchWideChar)

1. CodePage - 변환할 코드 페이지

          (보통 CP_ACP를 사용합니다. ANSI 코드 페이지를 사용하겠다는 거죠)


2. dwFlags - 어떤 캐릭터 형태로 변환할 것인지를 지정합니다.

          (보통 MB_PRECOMPOSED 를 사용합니다. 완성형으로 변환을 하겠다는 거죠.)


3. lpMultiByteStr - 유니코드로 변환할 문자열의 포인터입니다.


4. cbMultiByte - 위의 문자열의 길이입니다.


5. lpWideCharStr - 변환된 문자열을 받아들일 유니코드형 문자열 버퍼의 포인터 입니다.


6. cchWideChar - 위의 문자열의 길이입니다.


 


그럼 간단한 예를 적어 드리면...

char       szMuitiByte[255];
memset(szMultiByte, 0, 255);
strcpy(szMultibyte, "Test");

wchar_t  wszBuffer[255];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szMulitByte, strlen(szMultiByte), wszBuffer, 255);

더 자세한 사항은 MSDN을 참고하세요.




추가> wchar_t로 된 스트링을 출력할때 MessageBoxW ( ) 함수 사용

ex>


MessageBoxW ( NULL, wszBuffer, L"TEST", MB_OK);


======================================================================================

API를 이용하는 유니코드와 ANSI 문자열간의 변환 방법
API를 이용해서 유니코드와 ANSI 문자열간의 변환은 어떻게 수행합니까 ?

Visual C++에서 유니코드 문자열은 BSTR이란 타입으로 표시됩니다. 또 유니코드와 ANSI 문자열간의 변환을 위해서 윈도우 시스템에는 MultiByteToWideChar와 WideCharToMultiByte라는 API가 존재합니다. MFC에서의 BSTR 타입 변환방법이나 ATL로 하는 BSTR 타입 변환도 참고하시기 바랍니다.


ANSI 문자열에서 유니코드로의 변환 방법
 // sTime이란 ANSI 문자열을 bstr이란 이름의 유니코드(BSTR 타입) 변수로 변환
 char sTime[] = "유니코드 변환 예제";
 BSTR bstr;
 // sTime을 유니코드로 변환하기에 앞서 먼저 그 길이를 알아야 한다.
 int nLen = MultiByteToWideChar(CP_ACP, 0, sTime, lstrlen(sTime), NULL, NULL);
 // 얻어낸 길이만큼 메모리를 할당한다.
 bstr = SysAllocStringLen(NULL, nLen);
 // 이제 변환을 수행한다.
 MultiByteToWideChar(CP_ACP, 0, sTime, lstrlen(sTime), bstr, nLen);
         // 필요없어지면 제거한다.
         SysFreeString(bstr);

유니코드에서 ANSI 문자열로의 변환 방법
 // newVal이란 BSTR 타입에 있는 유니코드 문자열을 sTime이라는 ANSI 문자열로 변환
 char *sTime;
         int nLen = WideCharToMultiByte(CP_ACP, 0, newVal, -1, sTime, 0, NULL, NULL);
         sTime = malloc(nLen+1);
 WideCharToMultiByte(CP_ACP, 0, newVal, -1, sTime, 128, NULL, NULL);
        // 필요없으면 메모리를 제거한다.
        free(sTime);

유니코드 문자열을 UTF-8으로 변환하기
     WideCharToMultiByte 함수를 호출할 때 첫 번째 인자로 CP_UTF8을 지정하면 된다. UTF-8은 유니코드의 인코딩 스킴 중의 하나로 쉽게 말하자면 문자열 스트림에서 0을 빼고 표현하는 방법이라고 볼 수 있다.