Unicode与UTF-8转换//
/*
*Unicode转换成UTF-8
*@param strUnicode: 待转换的CString
*@param szUtf8:转换后的UTF-8
*@return :返回UTF-8格式的长度
*/
int CImpIEFav::UniToUTF8(CString strUnicode,char *szUtf8)
{
//MessageBox(strUnicode);
int ilen = WideCharToMultiByte(CP_UTF8, 0, (LPCTSTR)strUnicode, -1, NULL, 0, NULL, NULL);
char *szUtf8Temp=new char[ilen + 1];
memset(szUtf8Temp, 0, ilen +1);
WideCharToMultiByte (CP_UTF8, 0, (LPCTSTR)strUnicode, -1, szUtf8Temp, ilen, NULL,NULL);
//size_t a = strlen(szUtf8Temp);
sprintf(szUtf8, "%s", szUtf8Temp);//
delete[] szUtf8Temp;
return ilen;
}
/*
*UTF-8转换成Unicode
*@param UTF8: 待转换的的UTF-8
*@return :返回Unicode格式的字符串
*/
CString CImpIEFav::UTF8ToUni(char* UTF8)
{
DWORD dwUnicodeLen; //转换后Unicode的长度
TCHAR *pwText; //保存Unicode的指针
CString strUnicode; //返回值
//获得转换后的长度,并分配内存
dwUnicodeLen = MultiByteToWideChar(CP_UTF8,0,UTF8,-1,NULL,0);
pwText = new TCHAR[dwUnicodeLen];
if (!pwText)
{
return strUnicode;
}
//转为Unicode
MultiByteToWideChar(CP_UTF8,0,UTF8,-1,pwText,dwUnicodeLen);
//转为CString
strUnicode.Format(_T("%s"),pwText);
//清除内存
delete []pwText;
//返回转换好的Unicode字串
return strUnicode;
}
UNICODE下 CString与 Char*转换///
/*
*UNICODE下 CString转换成Char*
*@param StrChar: 转换后的char*
*@param CStr:待转换的CString
*@param CharLen:Char数组的长度
*/
void CImpIEFav::ConvertCStrToChar(char* StrChar, const CString CStr, int CharLen)
{
char* pTargetData = NULL;
int targetLen=WideCharToMultiByte(CP_ACP,0,CStr,-1,pTargetData,0,NULL,NULL);
pTargetData = new char[targetLen+1];
memset(pTargetData,0,targetLen+1);
WideCharToMultiByte(CP_ACP,0,CStr,-1,pTargetData,targetLen,NULL,NULL);
sprintf(StrChar, "%s", pTargetData);// CharLen:.net才需要CharLen作为第二个参数
delete []pTargetData;
}
//UNICODE下 Char*转换成CString
//功能:将char* 转换为CString
//参数:待转换的char*
//返回值:转换后的CString
CString CCommon::charToCString(char* result)
{
//将char 转换为 CString字符
DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, result, -1, NULL, 0);
wchar_t *pwText;
pwText = new wchar_t[dwNum];
if(!pwText)
{
delete []pwText;
return _T("");//暂时这样处理
}
MultiByteToWideChar (CP_ACP, 0, result, -1, pwText, dwNum);// 开始转换
CString cstr=pwText;
return cstr;
}
//UNICODE 转 urlencode//
//szEncode为utf8格式
//即要先转为UTF8才能转为urlencode
CString CBandToolBarCtrl::UniToUrlEncode(const char* szEncode)
{
CString strEncoded;
static const char szUnsafe[] = {"/"<>%//^[]`+$,@:;/!#?=&"};
static const char szHexChr[] = {"0123456789ABCDEF"};
int nLength = strlen(szEncode);
for(int i = 0; i < nLength; i++)
{
TCHAR ch = szEncode[i];
if((NULL == strchr(szUnsafe, ch))
&& ((int)ch > 32)
&& ((int)ch < 123))
{
strEncoded += ch;
}
else
{
strEncoded += CString("%");
strEncoded += szHexChr[(int)((ch >> 4) & 0x0f)];
strEncoded += szHexChr[(int)(ch & 0x0f)];
}
}
return strEncoded;
}
使用范例:
WCHAR *pbstrLocationURL = new WCHAR[MAX_PATH];
char szUrlTemp[MAX_PATH*3]={0};
UniToUTF8(pbstrLocationURL,szUrlTemp);
CString strUrl = UniToUrlEncode(szUrlTemp);
/GBK 与 Utf8转换
/*
*GBK格式转Utf8格式*
*@param strGBK: 待转换的GBK CString
*转换完成后,为Utf8 CString
*/
void General::ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);
strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
/*
*Utf8格式转GBK格式*
*@param strGBK: 待转换的Utf8 CString
*转换完成后,为GBK CString
*/
void General::ConvertUtf8ToGBK(CString& strUtf8)
{
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len+1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);
strUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
}