66

有什么方法吗?我的电脑是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 *'

我该怎么做?

4

4 回答 4

104

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

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

然后获取 C 字符串:

const wchar_t* widecstr = widestr.c_str();

这仅适用于 ASCII 字符串,但如果底层字符串是 UTF-8 编码的,它将不起作用。使用 MultiByteToWideChar() 之类的转换例程可确保正确处理此场景。

于 2008-10-29T13:41:13.257 回答
47

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

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

但是,由于您正在对窄字符串进行操作,因此您首先需要将其加宽。这里有多种选择;一种是使用 Windows 的内置MultiByteToWideChar例程。这会给你一个LPWSTR,相当于wchar_t*

于 2008-10-29T13:38:26.537 回答
9

您可以使用 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。

于 2008-10-29T13:49:56.857 回答
5

如果您使用的是 Linux/Unix,请查看 GNU C(来自 ISO C 90)中定义的 mbstowcs() 和 wcstombs()。

  • mbs 代表“多字节字符串”,基本上是通常的以零结尾的 C 字符串。

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

有关宽字符的更多背景信息,请查看此处的 glibc 文档。

于 2010-01-14T13:54:25.343 回答