2

正如标题所述,我需要一种将 PWCHAR 转换为 std::string 的方法。我可以在网上找到的唯一解决方案是相反的转换,所以如果有人能对此有所了解,我真的很喜欢。谢谢!

这是在 C++ 中。

4

2 回答 2

1

你会更容易使用std::wstring,因为它也是一个宽字符串类。如果您真的想使用std::string, 并将 2 字节字符转换为单字节或多字节字符,则需要使用执行该转换的函数。wcstombs()是用于执行此操作的 ANSI C 函数。您的平台可能会提供替代方案。

于 2012-08-07T21:28:52.100 回答
1

根据this MSDN pagePWCHAR声明如下:

typedef wchar_t WCHAR, *PWCHAR;

你想要的是std::wstring,在string.

const PWCHAR pwc;
std::wstring str(pwc);

std::wstring与 非常相似std::string,因为两者都是std::basic_string;的专业化 不同之处在于wstring使用wchar_t(Windows WCHAR),而string使用char.


如果你真的想要一个string(而不是一个wstring),建议的 C++ 方法是使用use_facet如下所示

const std::locale locale("C");
const std::wstring src = ...;
const std::string dst = ...;
std::use_facet<std::ctype<wchar_t> >(loc)
    .narrow(src.c_str(), src.c_str() + src.size(), '?', &*dst.begin());

您也可以单独转换为多字节 C 字符串,然后使用它来构建您的std::string. 然而,这不是在 C++ 中执行此操作的首选方式。执行此操作的函数是wcstombs,如下所述:

size_t wcstombs ( char * mbstr, const wchar_t * wcstr, size_t max );

由于您使用的是 Windows,因此您也可以使用WideCharToMultiByte此步骤。

int WideCharToMultiByte(
  __in       UINT CodePage,
  __in       DWORD dwFlags,
  __in       LPCWSTR lpWideCharStr,
  __in       int cchWideChar,
  __out_opt  LPSTR lpMultiByteStr,
  __in       int cbMultiByte,
  __in_opt   LPCSTR lpDefaultChar,
  __out_opt  LPBOOL lpUsedDefaultChar
);

LPSTR根据MSDN定义如下:

typedef CHAR *LPSTR;
typedef char CHAR;
于 2012-08-07T21:29:07.870 回答