(转载)GBKUTF8UNICODE编码转换
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(转载)GBKUTF8UNICODE编码转换相关的知识,希望对你有一定的参考价值。
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 }
以上是关于(转载)GBKUTF8UNICODE编码转换的主要内容,如果未能解决你的问题,请参考以下文章