IE에서 Get으로 서버(Clip보드도 마찬가지)에 보내는 경우,
건네주는 파라미터는 일반적으로 Encodnig 됩니다.
IE에서는 표준으로 UTF-8형식으로 사용하게 됩니다. 서버와의 통신시에 encode를 HTML태그의 메타 태그로
지정할수 있지만, GET방식에서는 Encode를 지정할수 없고 UTF8이 사용되게 됩니다.
Phase1
통신서버쪽이라면 아래의 함수부터 필요하겠지만.. 이번 클립보드의 경우에는 이 함수는 필요 없습니다.
int URLDecode( LPBYTE src, LPBYTE dst )
{
int p = 0;
int q = 0;
while( src[p] ) {
if( src[p]=='+' ) {
dst[q] = ' ';
} else if( src[p]=='%' ) {
BYTE c1 = src[++p] - '0'; if( c1>9 ) c1 -= 7;
BYTE c2 = src[++p] - '0'; if( c2>9 ) c2 -= 7;
dst[q] = (char)(c1 << 4 | c2);
} else {
dst[q] = src[p];
}
p++;
q++;
}
dst[q] = NULL;
return q;
} ※이 함수는 표준의 ASCII 문자에도 대응하고 있습니다.
Phase2
다음으로, UTF-8 형식을 UNICODE 로 변환합니다.
UTF-8은 이하와 같은 사양이 되고 있으므로, 이것을 분해해 UNICODE로 합니다.
변환전(UTF-8) 변환 후(UNICODE) 값의 범위
0aaaaaaa 00000000 0aaaaaaa 0 x0000∼0x007F
110aaaaa 10bbbbbb 00000aaa aabbbbbb 0 x0080∼0x07FF
1110aaaa 10bbbbbb 10cccccc aaaabbbb bbcccccc 0 x0800∼0xFFFF
우선 통상의 ASCII 문자는 1 바이트로 구성되므로, 변환전과 변환 후는 같게 됩니다.
또, 일본어의 한자 등은 3 바이트 구성이 되므로, 3번째 변환 방법으로 UNICODE로 변환할 수 있습니다.
이와 같이 변환되므로 아래와 같은 함수를 사용하면 편리합니다.
int Utf8ToUnicode( LPBYTE src, LPWSTR dst )
{
int p = 0;
int q = 0;
WCHAR d;
while( src[p] ) {
if( (src[p]&0xE0) ==0xE0 ) {
d = ((src[p]&0x0f)<<12) | ((src[p+1]&0x3F)<<6) | (src[p+2]&0x3F);
p+=3;
} else if( (src[p]&0xC0) ==0xC0 ) {
d = ((src[p]&0x1F)<<6) | (src[p+1]&0x3F);
p+=2;
} else {
d = src[p]&0x7F;
p++;
}
dst[q] = d;
q++;
}
dst[q] = NULL;
return q;
}
Phase3
UNICODE를 MBCS(SJIS등..)로 변환합니다.
이것은 WinAPI로 실행 할 수 있으므로, 직접 이 함수를 사용합니다.
n = WideCharToMultiByte( CP_ACP, 0, buf,-1, str, sizeof(str), NULL, NULL );
*buf는 UNICODE화 된 캐릭터버퍼입니다.
*str는 출력할 버퍼입니다.
추가로, 이 함수에서는 반환값인 변환 문자수에 마지막 NULL 문자의 수도 포함되는 것 같습니다.
이 함수의 반환값으로부터 1을 빼는 것으로 변환된 문자수를 얻을 수 있습니다.
나중에 strlen를 사용해도 좋을것 같습니다.
저는 아래와 같이 사용하였습니다.
int nDataLen = (int) _tcslen( (LPTSTR) pData );
LPWSTR unicodeChars = new WCHAR[nDataLen];
Utf8ToUnicode( (LPBYTE)pData, unicodeChars ); //Phase2
int nAsciiLen = WideCharToMultiByte( CP_ACP, 0, unicodeChars, -1, NULL, 0, NULL, NULL);
LPTSTR asciiChars = new char[nAsciiLen];
WideCharToMultiByte( CP_ACP, 0, unicodeChars, -1, asciiChars, nAsciiLen, NULL, NULL); //Phase3
delete[] unicodeChars;
//... SetDlgItemText( IDC_EDIT_TEXT, (LPCTSTR) asciiChars );
delete[] asciiChars;