unicode和多字节字符中CString转string方法,可解决中文乱码的问题

下文提供两个函数接口,分别实现unicode字符集下与多字节字符集下的CString转string 

1、unicode字符集下CString转string 

string CString2string(CString csStrData)
{
	int iLen = csStrData.GetLength() + 1;
	char* pSrc = csStrData.GetBuffer(iLen * sizeof(char));
	string strRet = string(pSrc);
	csStrData.ReleaseBuffer(iLen);
	return strRet;
}


2、多字节字符集下的CString转string 

string CString2string(CString csStrData)
{
	int iLen = csStrData.GetLength() + 1;
	char* pSrc = new char[iLen];
	if (pSrc == NULL)
	{
		return "";
	}

	memset(pSrc, 0, iLen);

	wchar_t* pwSrc = NULL;
	pwSrc = csStrData.GetBuffer(iLen * sizeof(wchar_t));
	WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pwSrc, -1, pSrc, iLen, NULL, NULL);

	string strRet = string(pSrc);
	delete [] pSrc;
	csStrData.ReleaseBuffer(iLen);
	return strRet;
}



3、一个整合的方法,适用于WIN32和win64

string CString2string(CString csStrData)
{
	string strRet ;
	char* pRet = NULL;
	int icsLen = csStrData.GetLength() + 1;
#if (defined(_WIN64))
	wchar_t* wptr = NULL;
	wptr = csStrData.GetBuffer(icsLen * sizeof(wchar_t));
	int icLen = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wptr, icsLen, NULL, 0, NULL, NULL);
	do 
	{
		pRet = new char[icLen];
		if (NULL == pRet)
		{
			return "";
		}

		WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wptr, icsLen, pRet, icLen, NULL, NULL);
		pRet[icLen] = '\0';
		strRet = string(pRet);
		delete [] pRet;		
	} while (0);
	csStrData.ReleaseBuffer(icsLen);
#else
	pRet = csStrData.GetBuffer(icsLen * sizeof(char));
	strRet = string(pRet);
	csStrData.ReleaseBuffer(icsLen);
#endif
	
	return strRet;
}



附一个string转wchar_t* 

例如:

string str("你好中国");
wchar_t* wc = new wchar_t[str.size()];
swprintf(wc, 100, L"%S", str.c_str()); //注意大写
//wc指向的内存区域存储这wchar_t类型的 ”你好中国“。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值