有时候获取web服务器返回的数据,显示出来中文是乱码的形式。这个时候就会用到下面这两个函数来转换。
char* CreateUTF8TextInitWithString(CString strValue)
{
char *buffer = NULL;
int length;
#ifdef _UNICODE
length = WideCharToMultiByte(CP_UTF8, 0, strValue, -1, NULL, 0, NULL, NULL);
#else
return NULL;
#endif
if (length <= 0)
{
return NULL;
}
buffer = new char[length];
if (buffer == NULL)
{
return NULL;
}
ZeroMemory(buffer, length);
#ifdef _UNICODE
WideCharToMultiByte(CP_UTF8, 0, strValue, -1, buffer, length, NULL, NULL);
#else
strcpy_s(buffer, length, strValue);
#endif
return buffer;
}
BOOL CreateString_InitWithUTF8Text(CString& str, char* pUTF8Text)
{
if (NULL == pUTF8Text)
{
return FALSE;
}
int unicodeLen = ::MultiByteToWideChar( CP_UTF8,
0,
pUTF8Text,
-1,
NULL,
0 );
wchar_t* pUnicode = new wchar_t[unicodeLen+1];
if (NULL == pUnicode)
{
return FALSE;
}
MultiByteToWideChar( CP_UTF8, 0, pUTF8Text, -1, (LPWSTR)pUnicode, unicodeLen );
str = pUnicode;
delete []pUnicode;
return TRUE;
}
int _tmain()
{
// 转换 CString 到 utf-8编码
char* buff = CreateUTF8TextInitWithString(CString(TEXT("这都不是问题吧。")));
// 转换 utf-8 到 CString 编码
CString str;
if (CreateString_InitWithUTF8Text(str, buff))
{
cout << "successed... ";
}
delete []buff;
return 0;
}
#include <string>
using std::string;
string GBKToUTF8(const std::string& strGBK)
{
string strOutUTF8 = "";
int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
WCHAR* str1 = new WCHAR[n];
ZeroMemory(str1, n*sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);
n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
char *str2 = new char[n];
ZeroMemory(str2, n);
WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
strOutUTF8 = str2;
delete [] str1;
delete[]str2;
return strOutUTF8;
}
string UTF8ToGBK(const string& strUTF8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
wchar_t *wszGBK = new wchar_t[len + 1];
memset(wszGBK, 0, (len + 1)*sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -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;
string strTemp(szGBK);
delete[]szGBK;
delete[]wszGBK;
return strTemp;
}