c++ 我想将std::string转换为常量wchar_t *

bgtovc5b  于 2022-12-24  发布在  其他
关注(0)|答案(5)|浏览(309)

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

我该怎么做呢?

67up9zun

67up9zun1#

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

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

然后得到C字符串:

const wchar_t* widecstr = widestr.c_str();

这只适用于ASCII字符串,但如果底层字符串是UTF-8编码的,则不适用。使用MultiByteToWideChar()这样的转换例程可以确保正确处理这种情况。

0lvr5msh

0lvr5msh2#

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

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

然而,由于你是在一个窄字符串上操作,你首先需要加宽它。一种是使用Windows内置的MultiByteToWideChar例程,它会给予你一个LPWSTR,等价于wchar_t*

jchrr9hc

jchrr9hc3#

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

7gyucuyw

7gyucuyw4#

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

  • mbs代表“多字节字符串”,基本上是常见的零终止C字符串。
  • wcs代表宽字符串,是wchar_t的数组。

有关宽字符的更多背景细节,请参阅glibc文档here

u0njafvf

u0njafvf5#

需要将一个wchar_t字符串传递给一个函数,并且首先能够从一个与整数变量连接的文本字符串创建该字符串。
原始字符串如下所示,其中4是物理驱动器号,但我希望它可以更改,以匹配我希望传递给函数的任何驱动器号

auto TargetDrive = L"\\\\.\\PhysicalDrive4";

以下工程

int a = 4;

std::string stddrivestring = "\\\\.\\PhysicalDrive" + to_string(a);

std::wstring widedrivestring = std::wstring(stddrivestring.begin(), stddrivestring.end());

const wchar_t* TargetDrive = widedrivestring.c_str();

相关问题