void CServerSession::CString2Char(CString str, char ch[])
{
int wLen = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);//得到Char的长度
WideCharToMultiByte(CP_ACP, 0, str, -1, ch, wLen, NULL, NULL); //将CString转换成char*
}
void CServerSession::ConvertUtf8ToGBK(CString& strUtf8)
{
//UNICODE编码下强制将wchar_t*转成char*
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)(LPCTSTR)strUtf8, -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len+1];
memset(wszGBK, 0, len * 2 + 2);
//多字符集下不用强制转成char*
//MultiByteToWideChar(CP_UTF8, 0,(LPCTSTR)strUtf8, -1, (LPWSTR)wszGBK, len);
MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)(LPCTSTR)strUtf8, -1, (LPWSTR)wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
::memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0,(LPWSTR)wszGBK, -1, szGBK, len, NULL,NULL);
strUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
}
void CServerSession::ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCSTR)(LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)(LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
::memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
char *CServerSession::UnicodeToUtf8(CString unicode)
{
int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, unicode, (DWORD)wcslen(unicode), NULL, 0, NULL, NULL);
//同上,分配空间要给'\0'留个空间
//UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存
char* szU8 = new char[u8Len + 1];
//转换
//unicode版对应的strlen是wcslen
::WideCharToMultiByte(CP_UTF8, NULL, unicode, (DWORD)wcslen(unicode), szU8, u8Len, NULL, NULL);
//最后加上'\0'
szU8[u8Len] = '\0';
return szU8;
}
char *CServerSession::UnicodeToAscii(CString unicode)
{
int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, unicode, (DWORD)wcslen(unicode), NULL, 0, NULL, NULL);
//同上,分配空间要给'\0'留个空间
char* szAnsi = new char[ansiLen + 1];
//转换
//unicode版对应的strlen是wcslen
::WideCharToMultiByte(CP_ACP, NULL, unicode, (DWORD)wcslen(unicode), szAnsi, ansiLen, NULL, NULL);
//最后加上'\0'
szAnsi[ansiLen] = '\0';
return szAnsi;
}
/*
LPCSTR 是const char*
LPCTSTR 是const wchar_t *
*/
CString CServerSession::UTF8ToUnicode(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,(LPWSTR)pwText,dwUnicodeLen);
//转为CString
strUnicode.Format(_T("%s"),pwText);
//清除内存
delete []pwText;
//返回转换好的Unicode字串
return strUnicode;
}
VC++的UNICODE工程一些常用转码
最新推荐文章于 2020-01-15 16:33:05 发布