{wchar_t*, wchar_t, wchat_t数组},{char,char*,char数组},{std::string,std::wstring},CString之间的相互转换

原帖不详,我从这找到的:http://www.cnblogs.com/sunnyjones/archive/2009/02/25/1397757.html

// char*------>wchar*

wchar_t* AnsiToUnicode( const char* szStr )
{
	int nLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0 );
	if (nLen == 0)
	{
		return NULL;
	}
	wchar_t* pResult = new wchar_t[nLen];
	MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen );
	return pResult;
}

//------------------ 将 宽字节wchar_t* 转换 单字节char*--------------//
inline char* UnicodeToAnsi( const wchar_t* szStr )
{
	int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL );
	if (nLen == 0)
	{
		return NULL;
	}
	char* pResult = new char[nLen];
	WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL );
	return pResult;
}


//-----------------------将单字符 string 转换为宽字符 wstring------------------------------
inline void Ascii2WideString( const std::string& szStr, std::wstring& wszStr )
{
	int nLength = MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, NULL, NULL );
	wszStr.resize(nLength);
	LPWSTR lpwszStr = new wchar_t[nLength];
	MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, lpwszStr, nLength );
	wszStr = lpwszStr;
	delete [] lpwszStr;
}

//----------------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
	char*   pChar = "我喜欢char";
	wchar_t* pWideChar = L"我讨厌wchar_t";
	wchar_t   tagWideCharList[100] ;
	char   ch = 'A';
	char   tagChar[100] = {NULL};
	CString   cStr;
	std::string str;
	// 注:设置语言环境以便输出WideChar
	setlocale(LC_ALL,"chs");
	// 注: char* 转换 wchar_t*
	// 注: wchar_t 未重载 << ,所以不可使用 cout << 输出
	pWideChar = AnsiToUnicode( pChar );
	// 注:printf("%ls") 和 wprintf(L"%s") 一致
	printf( "%ls\n", pWideChar );
	// 注:wchar_t* 转换 wchar_t[]
	wcscpy ( tagWideCharList, pWideChar );
	wprintf( L"%s\n", tagWideCharList );
	// 注:wchar_t[] 转换 wchar_t*
	pWideChar = tagWideCharList;
	wprintf( L"%s\n", pWideChar );
	// 注:char 转换 string
	str.insert( str.begin(), ch );
	cout << str << endl;
	// 注:wchar_t* 转换 string
	pWideChar = new wchar_t[str.length()];
	swprintf( pWideChar, L"%s", str.c_str());
	wprintf( L"%s\n", pWideChar );
	// 注:string 转换 char*
	pChar = const_cast<char*>(str.c_str());
	cout << pChar << endl;
	// 注:char* 转换 string
	str = std::string(pChar);
	// 注: cout 的 << 重载了string, 若printf 的话必须 printf("%s", str.c_str()); 
	//   而不可 print( "%s", str ); 因为 str 是个 string 类
	cout << str << endl;
	// 注:string 转换 char[]
	str = "无聊啊无聊";
	strcpy( tagChar, str.c_str() );
	printf( "%s\n", tagChar );
	// 注:string 转换 CString;
	cStr = str.c_str();
	// 注:CString 转换 string 
	str = string(cStr.GetBuffer(cStr.GetLength()));
	// 注:char* 转换 CString
	cStr = pChar;
	// 注:CString 转换 char*
	pChar = cStr.GetBuffer( cStr.GetLength() );
	// 注:CString 转换 char[]
	strncpy( tagChar, (LPCTSTR)CString, sizeof(tagChar));
	// 注:CString 转换 wchar_t*
	pWideChar = cStr.AllocSysString();
	printf( "%ls\n", pWideChar );
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值