Конвертировать WCHAR[260] в std::string
Я получил WCHAR[MAX_PATH] из (PROCESSENTRY32) pe32.szExeFile в Windows. Следующие не работают:
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;
4 ответа
Ваш звонок в WideCharToMultiByte
выглядит правильно, при условии ch
достаточно большой буфер После чего, однако, вы хотите назначить буфер (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*
т е р
Есть удобные классы конвертации из ATL; Вы можете использовать некоторые из них, например:
std::string s( CW2A(pe32.szExeFile) );
Однако обратите внимание, что преобразование из Unicode UTF-16 в ANSI может привести к потерям. Если вы не хотите конвертировать без потерь, вы можете конвертировать из UTF-16 в UTF-8 и хранить UTF-8 внутри std::string
,
Если вы не хотите использовать ATL, есть несколько удобных свободно доступных оболочек C++ вокруг сырого Win32 WideCharToMultiByte
конвертировать из UTF-16 в UTF-8, используя строки STL.
#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;