我想把std :: string转换成一个const wchar_t *
有什么方法吗? 我的电脑是AMD64。
::std::string str; BOOL loadU(const wchar_t* lpszPathName, int flag = 0);
当我使用:
loadU(&str);
VS2005编译器说:
Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *'
我该怎么做?
如果你有一个std :: wstring对象,你可以调用c_str()
来得到一个wchar_t*
:
std::wstring name( L"Steve Nash" ); const wchar_t* szName = name.c_str();
既然你是在一个狭窄的string上操作,然而,你首先需要扩大它。 这里有各种select。 一个是使用Windows内置的MultiByteToWideChar
例程。 这将给你一个LPWSTR
,这相当于wchar_t*
。
首先将其转换为std :: wstring:
std::wstring widestr = std::wstring(str.begin(), str.end());
然后得到Cstring:
wchar_t* widecstr = widestr.c_str();
这仅适用于ASCIIstring,但如果底层string是UTF-8编码,则不起作用。 使用像MultiByteToWideChar()这样的转换例程可确保正确处理此场景。
您可以使用ATL文本转换macros来将窄(char)string转换为宽(wchar_t)string。 例如,要转换一个std :: string:
#include <atlconv.h> ... std::string str = "Hello, world!"; CA2W pszWide(str.c_str()); loadU(pszWide);
你也可以指定一个代码页,所以如果你的std :: string包含UTF-8字符,你可以使用:
CA2W pszWide(str.c_str(), CP_UTF8);
非常有用,但只有Windows。
如果你在Linux / Unix上看看在GNU C(从ISO C 90)中定义的mbstowcs()和wcstombs()。
-
mbs代表“多字节string”,基本上是通常的零终止的Cstring。
-
wcs代表宽string,是一个wchar_t数组。
有关宽字符的更多背景细节,请参阅glibc文档。