我改变了我的类以使用std :: string(基于我得到的答案here但是我有一个函数返回wchar_t *。如何将它转换为std :: string?
我试过了:
std::string test = args.OptionArg();
但它说错误C2440:'初始化':无法从'wchar_t *'转换为'std :: basic_string< _Elem,_Traits,_Ax>'
答案 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::string
与TCHAR
,LPCTSTR
一起使用,等等
答案 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);