2008-10-29 71 views
48

有什么方法吗? 我的电脑是AMD64。我想将std :: string转换为常量wchar_t *

::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 *' 

我该怎么办呢?

回答

35

如果你有一个std :: wstring的对象,你可以调用它的c_str()获得wchar_t*

std::wstring name(L"Steve Nash"); 
const wchar_t* szName = name.c_str(); 

因为你是在一个狭窄的字符串操作,但是,你首先需要扩大它。这里有各种选择;一种是使用Windows内置的MultiByteToWideChar例程。这会给你一个LPWSTR,相当于wchar_t*

+0

或简单地做一个`string var = L“text”;` – cybermonkey 2014-11-09 17:13:20

+2

@ʎǝʞuoɯɹǝqʎɔ:你的意思是`wstring var = L“text”;` – 2015-03-12 20:45:43

75

首先将其转换为std :: wstring的:

std::wstring widestr = std::wstring(str.begin(), str.end()); 

然后得到的C字符串:

const wchar_t* widecstr = widestr.c_str(); 

这只适用于ASCII字符串,但如果基础字符串是它不会工作UTF-8编码。使用像MultiByteToWideChar()这样的转换例程可确保正确处理此场景。

+3

这对ASCII字符串应该可以正常工作,但是如果底层字符串是UTF-8编码的。使用像MultiByteToWideChar()这样的转换例程可确保正确处理此场景。 – 2008-10-29 13:50:05

+0

您应该使用MultiByteToWideChar和正确的代码页。确切地说,需要对它进行两次调用:第一次获得目标wchar_t字符串所需的长度,第二次将char字符串转换为wchar_t字符串。 – 2008-10-30 08:56:37

8

您可以使用ATL文本转换宏将窄(char)字符串转换为宽(wchar_t)字符串。例如,转换为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。

4

如果您在Linux/Unix上查看GNU C(来自ISO C 90)中定义的mbstowcs()和wcstombs()。

  • mbs表示“多字节字符串”,基本上是通常的零终止C字符串。

  • wcs代表宽字符串,是一个wchar_t数组。

欲了解宽字符的更多背景信息,请查看glibc文档here