vc6.0-mfc-字节码转换问题记录

69 阅读1分钟

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;
}