我想把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文档。