본문 바로가기
IT-개발,DB

[개발/VC++] API를 이용한 ASCII와 UNICODE변환및 코드페이지를 이용한 변환방법

by SB리치퍼슨 2015. 10. 7.

[개발/VC++] API를 이용한 ASCII와 UNICODE변환및 코드페이지를 이용한 변환방법



출처 : 인터넷


API를 이용한 ASCII와 UNICODE변환및 코드페이지를 이용한 변환방법 
 


[사용예제]

// 멀티바이트문자열 --> 와이드문자열
 char chText[100] = "abcdefg";  // 멀티바이트 문자열
 wchar_t* pszTmp = NULL; // 와이드만자열로 변경해서 저장될 주소
 int iLen = ::MultiByteToWideChar(CP_ACP, 0, pszText, -1, pszTmp, 0);
 pszTmp = new wchar_t[iLen+1];
 ::MultiByteToWideChar(CP_ACP, 0, pszText, -1, pszTmp, iLen);

 wchar_t tcResult[MAX_PATH] = _T("");
 wcscpy( tcResult, pszTmp ); 
 delete [] pszTmp;


// 와이드문자열 --> 멀티바이트문자열
wchar_t wcText[100] = _T("abcdefg");
char* pTemp = NULL;
int iLen = ::WideCharToMultiByte(CP_ACP, 0, wcText, -1, pTemp, 0, NULL, NULL);
pTemp = new char[iLen+1];
::WideCharToMultiByte(CP_ACP, 0, wcText, -1, pTemp, iLen, NULL, NULL);

char chResult[MAX_PAHT] = "";
strcpy( chResult, pszTemp );
delete [] pTemp;

 

 


 

 

 
Counter. 215

 

 
=========================================================
● API를 이용한 ASCII와 UNICODE의 변환방법
=========================================================
//////////////////////////////////////////////////
// 문자열을 유니코드 문자열(wide-character)로 매핑한다.
//
// 이 함수에 의해 매핑되는 문자열은 multibyte character set으로 부터 반드시 유래하는 건 아니다.
//////////////////////////////////////////////////
int MultiByteToWideChar (
UINT CodePage, // code page
DWORD dwFlags, // character-type options
LPCSTR lpMultiByteStr, // string to map
int cbMultiByte, // number of bytes in string
LPWSTR lpWideCharStr, // wide-character buffer
int cchWideChar // size of buffer
);
CodePage :
[in] 변환 수행에 사용될 code page를 기술한다.
이 파라메타는 설치되거나 또는 시스템에 유효한 어떤한 코드페이지가 될수 있다.
또는 아래에 기술된 값중 하나를 기술할 수 있다.

CP_ACP : ANSI 코드 페이지
CP_MACCP : Macintosh 코드 페이지
CP_OEMCP : OEB 코드 페이지

lpMultiByteStr :
[in] 변환 되어질 문자열 스트링 포인터

cbMultiByte
[in] lpMultiByteStr 파라메타에 의해 포인트된 문자열의 바이트 사이즈
lpWideCharStr
[out] 변환된 문자열을 수신할 버퍼 포인터
cchWideChar
[in] wide character로, lpWideCharStr파라메타에 의해 포인트된 버퍼의 크기
만약 이값이 0이면, 이함수는 wide character로 요구되어진 buffer size를 반환한다,
그리고 lpWideCharStr 버퍼의 사용을 하지 않는다.
Return Values

If the function succeeds, and cchWideChar is nonzero, the return value is the number of wide characters written to the buffer pointed to by lpWideCharStr.
If the function succeeds, and cchWideChar is zero, the return value is the required size, in wide characters, for a buffer that can receive the translated string.
If the function fails, the return value is zero. To get extended error information, call GetLastError. GetLastError may return one of the following error codes:
ERROR_INSUFFICIENT_BUFFER
ERROR_INVALID_FLAGS
ERROR_INVALID_PARAMETER
ERROR_NO_UNICODE_TRANSLATION
▷ASCII ==> UNICODE 변환방법
// 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);
▷UNICODE ==> ASCII 변환방법
// newVal이란 BSTR 타입에 있는 유니코드 문자열을 sTime이라는 ANSI 문자열로 변환
char sTime[128];
WideCharToMultiByte(CP_ACP, 0, newVal, -1, sTime, 127/*원래크기보다 1작게*/, NULL, NULL);

===================================================
● 코드 페이지를 이용하여 조합/완성/유니코드를 주무르자.
====================================================
윈도우즈 API에서 MultiByteToWideChar와 WideCharToMultiByte를 이용하면 완성,
조합에서 유니코드로 혹은 그 반대로 변환을 할 수 있습니다.
한글 95나 NT의 경우 기본적으로 조합형과 완성형의 코드페이지가 설치 되어있으므로 문제가 없으나
영문의 경우는 IE에서 한글 package를 설치하면 완성형은 설치가 되나 조합형은 없습니다.
코드페이지 설치.
'CP_XXX.nls'(WIN95) or 'C_XXX.nls'(WINNT)를 구하십시요. XXX 는 1361(조합) or 949(완성)입니다.
레지스트리에 다음의 값을 입력하십시요.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\XXX=CP_XXX.nls (WIN95)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\XXX=C_XXX.nls (WINNT)
조합형 코드를 보고자 할때는 cp_1361.nls(95용), c_1361.nls(nt용)을 구하셔서 시스템에 설치를 합니다.
95의 경우 system 디렉토리에, NT의 경우 system32 디렉토리에 설치하십시요.
=====================================================================
/*
* MultiByteToWideChar와 WideCharToMultiByte를 이용한 완성형, 조합형, 유니코드 변환.
*/
#include
#define CP_WANSUNG 949
#define CP_JOHAB 1361

void ConvertWansungToUnicode (LPCSTR szInput, int nInputSize, LPWSTR* szUnicode, int* nUnicodeSize)
{
// 유니코드의 크기를 구한다.
*nUnicodeSize = MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
NULL, 0);
*szUnicode = (LPWSTR)malloc(nUnicodeSize*sizeof(WCHAR));
// 실제 유니코드로 변환.
MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
*szUnicode, *nUnicodeSize);
}
void ConvertJohabToUnicode (LPCSTR szInput, int nInputSize, LPWSTR* szUnicode, int* nUnicodeSize)
{
// 유니코드의 크기를 구한다.
*nUnicodeSize = MultiByteToWideChar(CP_JOHAB, 0,
szInput, nInputSize,
NULL, 0);
*szUnicode = (LPWSTR)malloc(nUnicodeSize*sizeof(WCHAR));
// 실제 유니코드로 변환.
MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
*szUnicode, *nUnicodeSize);
}
void ConvertWansungToJohab (LPCSTR szInput, int nInputSize, LPSTR* szOutput, int* nOutputSize)
{
int nUnicodeSize;
LPWSTR szUnicode;
// 1. 완성형을 유니코드로 변환
// 유니코드의 크기를 구한다.
nUnicodeSize = MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
NULL, 0);
szUnicode = (LPWSTR)malloc(nUnicodeSize*sizeof(WCHAR));
// 실제 유니코드로 변환.
MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
szUnicode, nUnicodeSize);
// 2. 유니코드를 조합형으로 변환.
// 조합형의 크기를 구한다.
*nOutputSize = WideCharToMultiByte(CP_JOHAB, 0,
szUnicode, nUnicodeSize,
NULL, 0, NULL,NULL);
*szOutput = (LPSTR)malloc(*nOutputSize);
// 실제 조합형으로 변환.
WideCharToMultiByte(CP_JOHAB, 0,
szUnicode, nUnicodeSize,
*szOutput, *nOutputSize, NULL,NULL);
free(szUnicode);
}
유니코드 문자열을 UTF8 문자열로 변환하는 방법

KB Article ID: K001368

--------------------------------------------------------------------------------

이 내용이 적용되는 제품:
- Platform SDK

[요 약]

한글 윈도우 95에서 유니코드 문자열을 UTF8 문자열로 변환해 주는 다음 함수를 실행하면, 리턴되는 UTF8 버퍼에 아무런 값도 리턴 되지 않습니다. RFC2044에 명시된 스펙에 의거하여 문자열 변환하는 방법을 소개합니다.

#include “winnls.h”
WideCharToMultiByte(CP_UTF8, 0, szUniBuf, nUniLen, szUTFBuf, sizeof(szUTFBuf), NULL, NULL);

[추가 정보]

한글 윈도우 95에서 WIN32 API인 WideCharToMultiByte(CP_UTF8, xxx) 함수에서 UTF8 버퍼에 아무런 값도 리턴하지 않으므로 다음과 같이 스펙에 의거한 변환 루틴을 이용하여 UTF8 문자열 값을 얻습니다.

char* UnicodeToUTF8(wchar_t uc, char* UTF8)
{
if (uc <= 0x7f)
{
UTF8[0] = (char) uc;
UTF8[1] = (char) '\0';
}
else if (uc <= 0x7ff)
{
UTF8[0] = (char) 0xc0 + uc / (wchar_t) pow(2, 6);
UTF8[1] = (char) 0x80 + uc % (wchar_t) pow(2, 6);
UTF8[2] = (char) '\0';
}
else if (uc <= 0xffff)
{
UTF8[0] = (char) 0xe0 + uc / (wchar_t) pow(2, 12);
UTF8[1] = (char) 0x80 + uc / (wchar_t) pow(2, 6) % (wchar_t) pow(2, 6);
UTF8[2] = (char) 0x80 + uc % (wchar_t) pow(2, 6);
UTF8[3] = (char) '\0';
}

return UTF8;
}

int WideStrToUTF8Str(wchar_t *szUni,char *szUTF8)
{
int i=0;
char TempUTF8[10];
for(i=0;szUni[i];i++) {
UnicodeToUTF8(szUni[i], TempUTF8);
strcat(szUTF8, TempUTF8);
}
return strlen(szUTF8);
}

실제 위 두 함수를 사용하는 예제

{
wchar_t szUniBuf[MAXBUF];
int nUniLen, nUTFLen;
char szUTFBuf[MAXBUF];

nUniLen = MultiByteToWideChar(CP_ACP, 0, szHello, strlen(szHello), szUniBuf, MAXBUF);
szUniBuf[nUniLen] = 0;
memset(szUTFBuf, 0, MAXBUF);
nUTFLen = WideStrToUTF8Str(szUniBuf, szUTFBuf);
//nUTFLen = WideCharToMultiByte(CP_UTF8, 0, szUniBuf, nUniLen, szUTFBuf, MAXBUF, NULL, NULL);
szUTFBuf[nUTFLen]=0x00;

}


한글 EBCIDIC 코드를 한글 ASCII 코드로 변환하는 방법

KB Article ID: K001143

--------------------------------------------------------------------------------

[요 약]

프로그래밍적으로, 한글 EBCIDIC 코드를 한글 ASCII 코드로 변환하는 방법을
여기에서 소개한다.

[추가 정보]

#include 'snanls.h'
function()
{
int ret;
LPCTSTR lpSrcStr, lpDestStr;
ret =SnaInit(CP_949);
printf('ret = %d', ret);
ret = SnaNlsMapString (lpSrcStr, lpDestStr, CP_933, CP_949, 2, 2,
SNA_MULTIBYTE, SNA_MULTIBYTE, 0x0);
printf('ret = %d', ret);
}


1. SnaInit(CP_949)는 현재 이 프로그램이 실행되는 환경의 코드 페이지를
지정한다.
2. lpSrcStr은 IBM 메인 프레임 컴퓨터 등으로부터 받은 한글 EBCIDIC 코드이며,
lpDestStr은 리턴되는 ASCII 코드값이다.
3. #define CP_933 933 /* EBCDIC Korean */
#define CP_949 949 /* Korean */
UTF-8 to Unicode / Unicode to UTF-8 transformation 


반응형

댓글