Как преобразовать wchar t* в std:: string?

Я изменил свой класс, чтобы использовать std:: string (на основе ответа, который я получил здесь но функция, которую я имею, возвращает wchar_t *. Как преобразовать его в std:: string?

Я попытался это:

std::string test = args.OptionArg();

но он говорит об ошибке C2440: "инициализация": не удается преобразовать из "wchar_t *" в " std::basic_string'

5 ответов


вы можете просто использовать wstring и держите все в Unicode


wstring ws( args.OptionArg() );
string test( ws.begin(), ws.end() );

вы можете преобразовать широкую строку char в строку ASCII, используя следующую функцию:

#include <locale>
#include <sstream>
#include <string>

std::string ToNarrow( const wchar_t *s, char dfault = '?', 
                      const std::locale& loc = std::locale() )
{
  std::ostringstream stm;

  while( *s != L'' ) {
    stm << std::use_facet< std::ctype<wchar_t> >( loc ).narrow( *s++, dfault );
  }
  return stm.str();
}

имейте в виду, что это просто заменит любой широкий символ, для которого эквивалентный символ ASCII не существует с dfault параметр; он не преобразуется из UTF-16 в UTF-8. Если вы хотите преобразовать в UTF-8, используйте библиотеку, такую как ОИТ.


Это старый вопрос, но если это так, вы действительно не ищете преобразования, а скорее используете материал TCHAR от Mircosoft, чтобы иметь возможность создавать ASCII и Unicode, вы можете вспомнить, что std:: string действительно

typedef std::basic_string<char> string

чтобы мы могли определить наш собственный typedef, скажем

#include <string>
namespace magic {
typedef std::basic_string<TCHAR> string;
}

тогда вы можете использовать magic::string С TCHAR, LPCTSTR и так далее


просто для удовольствия :-):

const wchar_t* val = L"hello mfc";
std::string test((LPCTSTR)CString(val));