Как мне преобразовать wchar_t * в std :: string? - PullRequest
30 голосов
/ 03 декабря 2010

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

Я пробовал это:

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

но он говорит об ошибке C2440: «инициализация»: невозможно преобразовать из «wchar_t *» в «std :: basic_string <_Elem, _Traits, _Ax>»

Ответы [ 6 ]

44 голосов
/ 08 июля 2011
wstring ws( args.OptionArg() );
string test( ws.begin(), ws.end() );
8 голосов
/ 03 декабря 2010

Вы можете преобразовать строку широких символов в строку 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'\0' ) {
    stm << std::use_facet< std::ctype<wchar_t> >( loc ).narrow( *s++, dfault );
  }
  return stm.str();
}

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

7 голосов
/ 03 декабря 2010

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

5 голосов
/ 15 ноября 2013

Это старый вопрос, но если дело в том, что вы на самом деле не ищете конверсии, а используете материал 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 и т. Д.

1 голос
/ 05 ноября 2018

Следующий код более лаконичен:

wchar_t wstr[500];
char string[500];
sprintf(string,"%ls",wstr);
1 голос
/ 24 мая 2017

просто так: -):

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