将WCHAR 转换为std :: string

我在Windows上从(PROCESSENTRY32)pe32.szExeFile获得了WCHAR [MAX_PATH]。 以下不起作用:

std::string s; s = pe32.szExeFile; // compile error. cast (const char*) doesnt work either 

 std::string s; char DefChar = ' '; WideCharToMultiByte(CP_ACP,0,pe32.szExeFile,-1, ch,260,&DefChar, NULL); s = pe32.szExeFile; 

如果ch是足够大的缓冲区,那么对WideCharToMultiByte调用看起来是正确的。 然而,比想要将缓冲区( ch )分配给字符串(或使用它来构造字符串),而不是pe32.szExeFile

对于你的第一个例子,你可以做:

 std::wstring s(pe32.szExeFile); 

第二:

 char DefChar = ' '; WideCharToMultiByte(CP_ACP,0,pe32.szExeFile,-1, ch,260,&DefChar, NULL); std::wstring s(pe32.szExeFile); 

因为std::wstring有一个char* ctor

ATL有便利的转换类 ; 你可能想要使用其中的一些,例如:

 std::string s( CW2A(pe32.szExeFile) ); 

但是请注意,从Unicode UTF-16到ANSI的转换可能是有损的 。 如果你不是一个非有损的转换,你可以从UTF-16转换为UTF-8 ,并将UTF-8保存在std::string

如果你不想使用ATL,那么在原始的Win32 WideCharToMultiByte上有一些方便的免费C ++包装器, 可以使用STL字符串从UTF-16转换为UTF-8 。

 #ifndef __STRINGCAST_H__ #define __STRINGCAST_H__ #include <vector> #include <string> #include <cstring> #include <cwchar> #include <cassert> template<typename Td> Td string_cast(const wchar_t* pSource, unsigned int codePage = CP_ACP); #endif // __STRINGCAST_H__ template<> std::string string_cast( const wchar_t* pSource, unsigned int codePage ) { assert(pSource != 0); size_t sourceLength = std::wcslen(pSource); if(sourceLength > 0) { int length = ::WideCharToMultiByte(codePage, 0, pSource, sourceLength, NULL, 0, NULL, NULL); if(length == 0) return std::string(); std::vector<char> buffer( length ); ::WideCharToMultiByte(codePage, 0, pSource, sourceLength, &buffer[0], length, NULL, NULL); return std::string(buffer.begin(), buffer.end()); } else return std::string(); } 

并使用此模板如下

 PWSTR CurWorkDir; std::string CurWorkLogFile; CurWorkDir = new WCHAR[length]; CurWorkLogFile = string_cast<std::string>(CurWorkDir); .... delete [] CurWorkDir;