UNICODE <-> UTF8 잡동사니 2009. 8. 17. 15:23

UTF - 8 의 표

사용자 삽입 이미지









//////////////////////////////////////////////////////////////////////////
한글의 경우
1110 xxxx
10xx xxxx
10xx xxxx

쉬프트 연산후
xxxx 0000   ( << 4 )
xxxx xx00   ( << 2 )
xxxx xx00   ( << 2 )

유니코드로 합치기
   xxxx 0000 0000 0000   ( <<8칸 밀기 )
          xxxx xx00 0000   ( <<4칸 밀기 )
 |              00xx xxxx   ( >>2칸 밀기 )
------------------------------------
   xxxx xxxx xxxx xxxx

/---------------------
110x xxxx
10xx xxxx

xxxx x000    ( << 3 )
xxxx xx00    ( << 2 )

  0xxx xx00 0000
 |       00xx xxxx
-----------------
  0xxx xxxx xxxx
-------------------------/

//////////////////////////////////////////////////////////////////////////

WCHAR wTest[200] = L"Test문자열 1번 입니다.";
char szAnsiText[200];

int size = WideCharToMultiByte( CP_UTF8, 0, wTest, -1, NULL, NULL, NULL, NULL );
WideCharToMultiByte( CP_UTF8, 0, wTest, -1, szAnsiText, size, NULL, NULL );

BYTE  byWords[4];     // UTF-8의 최대크기
wchar_t  szUniText[100];    // UTF -> UNICODE로 변경된 데이터 저장할 버퍼

int nLen = ( int )_tcslen( szAnsiText ); // 문자열의 전체길이
int iUniPos = 0;       // 유니코드 버퍼의 위치
int iAnsiPos = 0;       // Ansi 버퍼의 위치

while( iAnsiPos != nLen )
{
  byWords[ 0 ] = szAnsiText[ iAnsiPos ];

  // 0x0800 ~ 0xffff
  if( 0xe0 <= byWords[ 0 ] )
  {
   byWords[ 1 ] = szAnsiText[ ++iAnsiPos ];
   byWords[ 2 ] = szAnsiText[ ++iAnsiPos ];

   byWords[ 0 ] <<= 4;
   byWords[ 1 ] <<= 2;
   byWords[ 2 ] <<= 2;

   szUniText[ iUniPos ] =
    byWords[ 0 ] << 8 | byWords[ 1 ] << 4 | byWords[ 2 ] >> 2;
  }
  // 0x0080 ~ 0x07ff
  else if( 0xc0 <= byWords[ 0 ] )
  {
   byWords[ 1 ] = szAnsiText[ ++iAnsiPos ];

   byWords[ 0 ] <<= 3;
   byWords[ 1 ] <<= 2;

   szUniText[ iUniPos ] = byWords[ 0 ] << 3 | byWords[ 1 ] >> 2;
  }
  // 0x0001 ~ 0x007f
  else
   szUniText[ iUniPos ] = byWords[ 0 ];

  ++iUniPos;
  ++iAnsiPos;

}

// 널문자 추가
szUniText[ iUniPos ] = 0;

'잡동사니' 카테고리의 다른 글

무슨 게임 무슨 엔진  (0) 2010.01.10
장난칠때 써먹을 반한 잡지식?  (0) 2009.10.29
성향 테스트  (0) 2009.10.05