原文引用:http://hi.baidu.com/harbinxxh/blog/item/1f8b721caaedd5dcc2ce794f.html
参考:http://www.cnitblog.com/textbox/archive/2010/03/16/64672.aspx
一些转换函数,主要针对宽字符。字符串是根本啊,要好好掌握了
WideCharToMultiByte(CP_UTF8, 0, hostname.AllocSysString(), -1, str, 100, NULL, NULL);
#include <string> // 使用CString必须使用MFC,并且不可包含<windows.h> #define _AFXDLL #include <afx.h> using namespace std; //---------------------------------------------------------------------------------- //将 单字节char* 转换为 宽字节 wchar* inline 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 ); }