[개발/VC++] UTF8Decoding, UTF8Encoding
출처 : 인터넷
멀티바이트 환경에서 변환같음.
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;
}
'IT-개발,DB' 카테고리의 다른 글
[개발/디자인] RGB 색상표 (0) | 2015.10.26 |
---|---|
[개발/VC++] IE 보호 모드에서 비보호 모드 프로세스 실행 (0) | 2015.10.08 |
[개발/VC++] MultibyteToUTF8, UTF8ToMultibyte (0) | 2015.10.08 |
[개발/VC++] API를 이용한 ASCII와 UNICODE변환및 코드페이지를 이용한 변환방법 (0) | 2015.10.07 |
[개발/VC++] URLEncode, URLDecode, 유니코드 변환 소스 (0) | 2015.10.07 |
댓글