我正在寻找将 std: : string 转换为 LPCWSTR 的方法或代码片段
如果您处于 ATL/MFC 环境中,可以使用 ATL 转换宏:
#include <atlbase.h> #include <atlconv.h> . . . string myStr("My string"); CA2W unicodeStr(myStr);
然后可以将 unicodeStr 用作 LPCWSTR。Unicode 字符串的内存在堆栈上创建并释放,然后执行 unicodeStr 的析构函数。
解决方案实际上比其他任何建议都要容易得多:
std::wstring stemp = std::wstring(s.begin(), s.end()); LPCWSTR sw = stemp.c_str();
最棒的是,它是独立于平台的。
我更喜欢使用标准转换器:
#include <codecvt> std::string s = "Hi"; std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; std::wstring wide = converter.from_bytes(s); LPCWSTR result = wide.c_str();
请在这个答案中找到更多的细节: https://stackoverflow.com/a/18597384/592651
更新12/21/2020: 我的回答被@Andreas H 评论了。我认为他的评论很有价值,所以我相应地更新了我的回答:
在 C + + 17中不推荐使用 codecvt_utf8_utf16。 此外,该代码还暗示源编码是 UTF-8,而它通常不是 UTF-8。 在 C + + 20中,UTF-8有一个单独的 std: : u8string 类型。
codecvt_utf8_utf16
但是它对我很有用,因为我仍然在使用旧版本的 C + + ,而且我的源代码是 UTF-8。
.c_str()
.data()
const_cast
(我的意思是,通常使用 const_cast可能是危险的)
const
std::wstring s2ws(const std::string &s, bool isUtf8 = true) { int len; int slength = (int)s.length() + 1; len = MultiByteToWideChar(isUtf8 ? CP_UTF8 : CP_ACP, 0, s.c_str(), slength, 0, 0); std::wstring buf; buf.resize(len); MultiByteToWideChar(isUtf8 ? CP_UTF8 : CP_ACP, 0, s.c_str(), slength, const_cast<wchar_t *>(buf.c_str()), len); return buf; } std::wstring wrapper = s2ws(u8"My UTF8 string!"); LPCWSTR result = wrapper.c_str();
注意 ,我们应该使用 CP_UTF8作为 C + + 的字符串文字,但是在某些情况下,您可能需要使用 CP_ACP(通过将第二个参数设置为 false)。
CP_UTF8
CP_ACP
false
这很简单,不需要应用任何自定义的方法。试试这个:
string s = "So Easy Bro" LPCWSTR wide_string; wide_string = CA2T(s.c_str());
我觉得会有用的。
如果您使用的是 QT,那么您可以转换为 QString,然后 myqstring.toStdWString ()就可以实现这个功能。