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

[개발/VC++] UTF8Decoding, UTF8Encoding

by SB리치퍼슨 2011. 2. 21.

출처 : 인터넷

멀티바이트 환경에서 변환같음.

char GetHexChar(LPCTSTR str)
{
 int i,num;
 char c[2];
 if(strlen(str)>2) return 0;
 for(i=0;i<2;i++)
 {
  num=toupper(str[i]) - 0x30;
  if(num<0 || num>9)
  {
   if(num>=0x11 && num<=0x16) num-=7;
   else num=0;
  }
  c[i]=(char)num;
 }
 return c[0]*16+c[1];
}
void ParseEscStr(LPCTSTR src, CString &dst, BOOL bEsc)
{
 int n,i;
 char buff[10];
 CString str;
 n = (int)strlen(src);
 dst.Empty();
 if(bEsc)
 {
  for(i=0;i<n;i++)
  {
   if(src[i]<0 || src[i]==0x20)
   {
    wsprintf(buff,"%c%.2x",'%',(unsigned char)src[i]);
    str=buff; str.MakeUpper();
    dst+=str;
   }
   else
    dst+=src[i];
  }
 }
 else
 {
  i=0;
  while(TRUE)
  {
   if(i>=n) break;
   if(src[i]=='%')
   {
    if(i+3>n) break;
    wsprintf(buff,"%c%c",src[i+1],src[i+2]);
    dst+=GetHexChar(buff);
    i+=3;
   }
   else
   {
    dst+=src[i];
    i++;
   }

  }
 }
}


BOOL UTF8Decoding(LPCTSTR src,CString& dst)
{
 CString str;
 ParseEscStr(src,str,FALSE);
 int len=MultiByteToWideChar(CP_UTF8,MB_ERR_INVALID_CHARS,str,-1,NULL,0);
 if(len==0) return FALSE;
 LPWSTR pwStr=new WCHAR[len];
 MultiByteToWideChar(CP_UTF8,MB_ERR_INVALID_CHARS,str,-1,pwStr,len);
 dst=pwStr;
 delete[] pwStr;
 return TRUE;
}
void UTF8Encoding(LPCTSTR src,CString& dst)
{
 CString str=src;
 BSTR bstr=str.AllocSysString();
 int len=WideCharToMultiByte(CP_UTF8,0,bstr,-1,NULL,0,NULL,NULL);
 if(len==0) { dst=src; ::SysFreeString(bstr); return; }
 LPTSTR pStr=new char[len];
 WideCharToMultiByte(CP_UTF8,0,bstr,-1,pStr,len,NULL,NULL);
 ParseEscStr(pStr,dst,TRUE);
 ::SysFreeString(bstr);
 delete[] pStr;
 return;
}

반응형

댓글