UTF-8转string
std::string UTF8Tostring(const std::string& strSrc)
{
int nwLen = MultiByteToWideChar(CP_UTF8, 0, strSrc.c_str(), -1, NULL, 0);
wchar_t* pwszBuf = new wchar_t[nwLen + 1]; //一定要加1,不然会出现尾巴
memset(pwszBuf, 0, nwLen * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, strSrc.c_str(), strSrc.length(), pwszBuf, nwLen);
int nLen = WideCharToMultiByte(CP_ACP, 0, pwszBuf, -1, NULL, NULL, NULL, NULL);
char* pszBuf = new char[nLen + 1];
memset(pszBuf, 0, nLen + 1);
WideCharToMultiByte(CP_ACP, 0, pwszBuf, nwLen, pszBuf, nLen, NULL, NULL);
std::string strRet = pszBuf;
delete []pszBuf;
delete []pwszBuf;
pszBuf = NULL;
pwszBuf = NULL;
return strRet;
}
String转Unicode
std::string StrToUnicode(const string &strSrc )
{
int nwLen = ::MultiByteToWideChar(CP_ACP, 0, strSrc.c_str(), -1, NULL, 0);
wchar_t* pwszBuf = new wchar_t[nwLen + 1]; //一定要加1,不然会出现尾巴
ZeroMemory(pwszBuf, nwLen * 2 + 2);
::MultiByteToWideChar(CP_ACP, 0, strSrc.c_str(), strSrc.length(), pwszBuf, nwLen);
int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwszBuf, -1, NULL, NULL, NULL, NULL);
char* pszBuf = new char[nLen + 1];
ZeroMemory(pszBuf, nLen + 1);
::WideCharToMultiByte(CP_UTF8, 0, pwszBuf, nwLen, pszBuf, nLen, NULL, NULL);
std::string strRet(pszBuf);
delete []pwszBuf;
delete []pszBuf;
pwszBuf = NULL;
pszBuf = NULL;
return strRet;
}
GBK转unicode
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;
}
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;
}
CString转string
CString strMfc = "test";
std::string strStr;
strStr = strMfc.GetBuffer(0);
string转CString
CString strMfc;
string strStr = "test";
strMfc = strStr.c_str();
UTF8转GBK
std::string UTF8ToGBK( const std::string& strUtf8 )
{
int nlen = MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, NULL, 0);
unsigned short* wszGBK = new unsigned short[nlen + 1];
memset(wszGBK, 0, nlen*2+2);
MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1,(LPWSTR)wszGBK, nlen);
nlen = WideCharToMultiByte(CP_ACP, 0 , (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
char* szGBK = new char[nlen + 1];
memset(szGBK, 0, nlen + 1);
WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, nlen, NULL, NULL);
std::string strTemp(szGBK);
delete[] szGBK;
delete[] wszGBK;
return strTemp;
}