string && wstring

来源:互联网 发布:淘宝免运费怎么设置 编辑:程序博客网 时间:2024/06/06 10:08
 
  • #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 );
  • }