utf8 转 ANSI
//调用
BYTE cTempBytes[MSG_BUF_LEN]={0};
void ReadString2(UINT &nStart, const UINT nEnd, const BYTE cSpace, CString& sReturn)
{
int i = 0;
BYTE cBytes[MSG_BUF_LEN]={0};
for (; nStart != nEnd; nStart++)
{
BYTE cByte = *(BYTE *)(m_pcBuffer + nStart);
cBytes[i]=cByte;
i++;
if (cByte == cSpace)
{
nStart++;
break;
}
else
{
//sReturn += cByte;
}
}
Utf8ToAnsi((char*)cBytes,(char*)cTempBytes,sizeof(cBytes));
sReturn.Format("%s",cTempBytes);
}
//实现方法
void Utf8ToAnsi(const char* pchSrc, char* pchDest, int nDestLen)
{
if (pchSrc == NULL || pchDest == NULL)
{
return;
}
// 先将utf8转成Unicode
int nUnicdeBufLen = MultiByteToWideChar(CP_UTF8, 0, pchSrc, -1, NULL, 0);
WCHAR* pUnicodeTmpBuf = new WCHAR[nUnicdeBufLen + 1];
memset(pUnicodeTmpBuf, 0, (nUnicdeBufLen + 1) * sizeof(WCHAR));
MultiByteToWideChar(CP_UTF8, 0, pchSrc, -1, pUnicodeTmpBuf, nUnicdeBufLen + 1);
// 再将Unicode转成utf8
int nAnsiBuflen = WideCharToMultiByte(CP_ACP, 0, pUnicodeTmpBuf, -1, NULL, 0, NULL, NULL);
char* pAnsiTmpBuf = new char[nAnsiBuflen + 1];
memset(pAnsiTmpBuf, 0, nAnsiBuflen + 1);
WideCharToMultiByte(CP_ACP, 0, pUnicodeTmpBuf, -1, pAnsiTmpBuf, nAnsiBuflen + 1, NULL, NULL);
int nLen = strlen(pAnsiTmpBuf);
if (nLen + 1 > nDestLen)
{
strncpy(pchDest, pAnsiTmpBuf, nDestLen - 1);
pchDest[nDestLen - 1] = 0;
}
else
{
strcpy(pchDest, pAnsiTmpBuf);
}
delete []pAnsiTmpBuf;
delete []pUnicodeTmpBuf;
}
Unicode 转 ASIC
//调用
wchar_t ch2[]={ L'l',L'o',L'v',L'e' ,0};
LPOLESTR oleStr = ch2;
CString vvv = Unicode2Ansi(vv);
std::cout<< (LPCTSTR)vvv << std::endl;
//unicode → ansi
CString Unicode2Ansi(CString source)
{
CString value;
BYTE cTempBytes[512] = {0};
char* pchDest = (char*)cTempBytes;
int nDestLen = source.GetLength() + 1;
int nUnicdeBufLen = MultiByteToWideChar(CP_ACP, 0, source, -1, NULL, 0);
WCHAR* pUnicodeTmpBuf = new WCHAR[nUnicdeBufLen + 1];
memset(pUnicodeTmpBuf, 0, (nUnicdeBufLen + 1) * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, source, -1, pUnicodeTmpBuf, nUnicdeBufLen + 1);
// 再将Unicode转成utf8
int nAnsiBuflen = WideCharToMultiByte(CP_ACP, 0, pUnicodeTmpBuf, -1, NULL, 0, NULL, NULL);
char* pAnsiTmpBuf = new char[nAnsiBuflen + 1];
memset(pAnsiTmpBuf, 0, nAnsiBuflen + 1);
WideCharToMultiByte(CP_ACP, 0, pUnicodeTmpBuf, -1, pAnsiTmpBuf, nAnsiBuflen + 1, NULL, NULL);
int nLen = strlen(pAnsiTmpBuf);
if (nLen + 1 > nDestLen)
{
strncpy(pchDest, pAnsiTmpBuf, nDestLen - 1);
pchDest[nDestLen - 1] = 0;
}
else
{
strcpy(pchDest, pAnsiTmpBuf);
}
value.Format("%s",pchDest);
delete []pAnsiTmpBuf;
delete []pUnicodeTmpBuf;
return value;
}