1、GBK轉換到Unicode編碼ide
std::string Gbk2Unicode(std::string &strValue) { std::string strReturn; unsigned char chTemp; int nLength = strValue.length()*4+1; WCHAR *pwchBuf = new WCHAR[nLength]; memset(pwchBuf, 0, sizeof(WCHAR) * nLength); MultiByteToWideChar(CP_ACP, 0, strValue.c_str(), -1, (LPWSTR)pwchBuf, nLength); for (size_t i = 0; i < wcslen(pwchBuf); i++) { strReturn += "\\u"; chTemp = *((unsigned char*)pwchBuf+i*2+1); if(chTemp) { strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp >> 4) ); strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp % 16) ); } chTemp = *((unsigned char*)pwchBuf+i*2); strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp >> 4) ); strReturn += m_clsmyOpenssl.char_to_hex( (unsigned char)(chTemp % 16) ); } delete[]pwchBuf; pwchBuf = NULL; return strReturn; }
2、Unicode轉換到GBK編碼編碼
std::string Unicode2GBK(std::string &strValue) { std::vector<std::string> vcString; MyTools::SplitString(strValue, "\\u", vcString); wchar_t* pwBuf = new wchar_t[strValue.length() + 1]; memset(pwBuf, 0, (strValue.length() + 1)* sizeof(wchar_t)); int j(0); for(std::vector<std::string>::iterator it = vcString.begin(); it != vcString.end(); ++it) { if (it->empty()) { continue; } unsigned short wcTmp = 0; unsigned char cTmp = 0; //由於有中文字符混合ASSCII碼狀況,因此條件爲k < it->length() for(size_t k = 0; k < it->length(); ++k) { cTmp = (unsigned char)(*it)[k]; if(cTmp <= '9')//0x30~0x39 即0~9 { wcTmp |= (cTmp & 0x0f) << (it->length() - k - 1) * 4; } else if(cTmp >= 'a')//0x61~7a 即a~z { wcTmp |= (cTmp - 0x57) << (it->length() - k - 1) * 4; } else//0x41~5a 即A~Z { wcTmp |= (cTmp - 0x37) << (it->length() - k - 1) * 4; } } pwBuf[j++] = (wchar_t)wcTmp; } char *pDst = new char[strValue.length() + 1]; memset(pDst, 0, (strValue.length() + 1) * sizeof(char)); WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, (char*)pDst, strValue.length() - 1, NULL, NULL); std::string strRet(pDst); delete[]pwBuf; pwBuf= NULL; delete[]pDst; pDst=NULL; return strRet; }