Programming Basic2006. 8. 10. 14:10

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;




Posted by BAGE