我更改了班级使用std :: string(根据我得到的答案 这里 但是我有一个函数返回wchar_t *。如何将其转换为STD :: String?

我尝试了:

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

但是它说错误c2440:'初始化':无法从'wchar_t *'转换为'std :: basic_string <_Elem,_traits,_ax>'

有帮助吗?

解决方案

你可以只使用 wstring 并将所有内容保持在Unicode中

其他提示

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

您可以使用以下功能将宽字符串转换为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.

这是一个古老的问题,但是如果是这种情况,您并不是真正寻求转换,而是使用Mircosoft的TCHAR东西来构建ASCII和Unicode,您可能会记得STD :: String确实是

typedef std::basic_string<char> string

因此,我们可以定义自己的Typedef,说

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

那你可以使用 magic::stringTCHAR, LPCTSTR, ,等等

只是为了好玩 :-):

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

以下代码更简洁:

wchar_t wstr[500];
char string[500];
sprintf(string,"%ls",wstr);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top