正如标题所述,我需要一种将 PWCHAR 转换为 std::string 的方法。我可以在网上找到的唯一解决方案是相反的转换,所以如果有人能对此有所了解,我真的很喜欢。谢谢!
这是在 C++ 中。
你会更容易使用std::wstring
,因为它也是一个宽字符串类。如果您真的想使用std::string
, 并将 2 字节字符转换为单字节或多字节字符,则需要使用执行该转换的函数。wcstombs()是用于执行此操作的 ANSI C 函数。您的平台可能会提供替代方案。
根据this MSDN page,PWCHAR
声明如下:
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;