GBK、UTF8、UNICODE编码转换

 1 string GBKToUTF8(const std::string& strGBK)
 2 {
 3     int nLen = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
 4     WCHAR * wszUTF8 = new WCHAR[nLen];
 5     MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, wszUTF8, nLen);
 6 
 7     nLen = WideCharToMultiByte(CP_UTF8, 0, wszUTF8, -1, NULL, 0, NULL, NULL);
 8     char * szUTF8 = new char[nLen];
 9     WideCharToMultiByte(CP_UTF8, 0, wszUTF8, -1, szUTF8, nLen, NULL, NULL);
10 
11     std::string strTemp(szUTF8);
12     delete[]wszUTF8;
13     delete[]szUTF8;
14     return strTemp;
15 }
 1 string UTF8ToGBK(const std::string& strUTF8)
 2 {
 3     int nLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
 4     unsigned short * wszGBK = new unsigned short[nLen + 1];
 5     memset(wszGBK, 0, nLen * 2 + 2);
 6     MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, (LPWSTR)wszGBK, nLen);
 7 
 8     nLen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
 9     char *szGBK = new char[nLen + 1];
10     memset(szGBK, 0, nLen + 1);
11     WideCharToMultiByte(CP_ACP,0, (LPWSTR)wszGBK, -1, szGBK, nLen, NULL, NULL);
12 
13     std::string strTemp(szGBK);
14     delete[]szGBK;
15     delete[]wszGBK;
16     return strTemp;
17 }

 

 1 std::string Gbk2Unicode(std::string &strValue)
 2 {
 3     std::string strReturn;
 4     unsigned char chTemp;
 5     int nLength = strValue.length()*4+1;
 6     WCHAR *pwchBuf = new WCHAR[nLength];
 7     memset(pwchBuf, 0, sizeof(WCHAR) * nLength);
 8 
 9     MultiByteToWideChar(CP_ACP, 0, strValue.c_str(), -1, (LPWSTR)pwchBuf, nLength);
10 
11     for (size_t i = 0; i < wcslen(pwchBuf); i++)
12     {
13         strReturn += "\\u";
14         chTemp = *((unsigned char*)pwchBuf+i*2+1);
15         if(chTemp)
16         {
17             strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp >> 4) );
18             strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp % 16) );
19         }
20         chTemp = *((unsigned char*)pwchBuf+i*2);
21         strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp >> 4) );
22         strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp % 16) );
23     }
24     delete[]pwchBuf;
25     pwchBuf = NULL;
26     return strReturn;
27 }
 1 std::string Unicode2GBK(std::string &strValue)
 2 {
 3     std::vector<std::string> vcString;
 4     MyTools::SplitString(strValue, "\\u", vcString);
 5 
 6     wchar_t* pwBuf = new wchar_t[strValue.length() + 1];
 7     memset(pwBuf, 0, (strValue.length() + 1)* sizeof(wchar_t));
 8 
 9     int j(0);
10 
11     for(std::vector<std::string>::iterator it = vcString.begin(); it != vcString.end(); ++it)
12     {
13         if (it->empty())
14         {
15             continue;
16         }
17         unsigned short wcTmp = 0;
18         unsigned char cTmp = 0;
19 
20         //因为有中文字符混合ASSCII码情况,所以条件为k < it->length()
21         for(size_t k = 0; k < it->length(); ++k)
22         {
23             cTmp = (unsigned char)(*it)[k];
24 
25             if(cTmp <= '9')//0x30~0x39 即0~9
26             {
27                 wcTmp |= (cTmp & 0x0f) << (it->length() - k - 1) * 4;
28             }
29             else if(cTmp >= 'a')//0x61~7a 即a~z
30             {
31                 wcTmp |= (cTmp - 0x57) << (it->length() - k - 1) * 4;
32             }
33             else//0x41~5a 即A~Z
34             {
35                 wcTmp |= (cTmp - 0x37) << (it->length() - k - 1) * 4;
36             }
37         }
38         pwBuf[j++] = (wchar_t)wcTmp;
39     }
40     char *pDst = new char[strValue.length() + 1];
41     memset(pDst, 0, (strValue.length() + 1) * sizeof(char));
42 
43     WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, (char*)pDst, strValue.length() - 1, NULL, NULL);
44     std::string strRet(pDst);
45 
46     delete[]pwBuf;
47     pwBuf= NULL;
48 
49     delete[]pDst;
50     pDst=NULL;
51 
52     return strRet;
53 }

 

你可能感兴趣的:(unicode)