如何将wchar_t *转换为std :: string?

时间:2010-12-02 21:12:27

标签: c++ string stdstring wchar-t

我改变了我的类以使用std :: string(基于我得到的答案here但是我有一个函数返回wchar_t *。如何将它转换为std :: string?

我试过了:

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

但它说错误C2440:'初始化':无法从'wchar_t *'转换为'std :: basic_string< _Elem,_Traits,_Ax>'

6 个答案:

答案 0 :(得分:44)

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

答案 1 :(得分:8)

您可以使用以下函数将宽字符串转换为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();
}

请注意,这只会替换dfault参数中不存在等效ASCII字符的任何宽字符;它不会从UTF-16转换为UTF-8。如果要转换为UTF-8,请使用ICU等库。

答案 2 :(得分:7)

您可以使用wstring并保留Unicode中的所有内容

答案 3 :(得分:5)

这是一个老问题,但如果是这样的话,你并不真正寻求转换,而是使用Mircosoft的TCHAR能够构建ASCII和Unicode,你可以回想起std :: string真的是< / p>

typedef std::basic_string<char> string

所以我们可以定义自己的typedef,比如说

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

然后,您可以将magic::stringTCHARLPCTSTR一起使用,等等

答案 4 :(得分:1)

只是为了好玩: - ):

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

答案 5 :(得分:1)

以下代码更简洁:

wchar_t wstr[500];
char string[500];
sprintf(string,"%ls",wstr);