GBK UTF8 ANSI UNICODE 互转

来源:互联网 发布:linux vi 退出不保存 编辑:程序博客网 时间:2024/05/18 02:55
1、将GBK转换成UTF8

string GBKToUTF8(const std::string& strGBK)
{
     string strOutUTF8 = "";
     WCHAR * str1;
     int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
     str1 = new WCHAR[n];
     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];
     WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
     strOutUTF8 = str2;
     delete[]str1;
     str1 = NULL;
     delete[]str2;
     str2 = NULL;
     return strOutUTF8;
}

2、将UTF8转换成GBK

string UTF8ToGBK(const std::string& strUTF8)
{
     int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
     unsigned short * wszGBK = new unsigned short[len + 1];
     memset(wszGBK, 0, len * 2 + 2);
     MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)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;
     std::string strTemp(szGBK);
     delete[]szGBK;
     delete[]wszGBK;
     return strTemp;

}

//UTF-8到GB2312的转换
char* U2G(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
return str;
}


//GB2312到UTF-8的转换
char* G2U(const char* gb2312)
{
int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
return str;
}
void AtoW(LPSTR psz, LPTSTR &pwsz)
{
ASSERT(psz != NULL); 
const int size = MultiByteToWideChar(CP_ACP, 0, psz, -1, NULL, 0); 
ASSERT(size > 0); 
pwsz = (LPWSTR) malloc(sizeof(WCHAR)*size); 
ASSERT(pwsz != NULL); 
memset(pwsz, 0, sizeof(WCHAR)*size); 
VERIFY(MultiByteToWideChar(CP_ACP, 0, psz, -1, pwsz, size) != 0); 
}
void WtoA(LPCWSTR pwsz, LPSTR &m_psz)
{
ASSERT(pwsz != NULL); 
const int size = WideCharToMultiByte(CP_ACP, 0, pwsz, -1, 
NULL, 0, NULL, NULL); 
ASSERT(size > 0); 
m_psz = (LPSTR) malloc(sizeof(CHAR)*size); 
ASSERT(m_psz != NULL); 
WideCharToMultiByte(CP_ACP, 0, pwsz, -1,m_psz, size, NULL, NULL);
}



原创粉丝点击