Reputation: 27407
I'm looking for a method, or a code snippet for converting std::string to LPCWSTR
Upvotes: 144
Views: 240500
Reputation: 8826
.c_str()
method (maybe .data()
too), which allows us to use const_cast
,(I mean, normally using
const_cast
may be dangerous)
const
" input parameter.const_cast
" instead of any unnecessary allocation and deletion.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();
Note that we should use
CP_UTF8
for C++'s string-literal, but in some cases you may need to instead useCP_ACP
(by setting second parameter tofalse
).
Upvotes: 1
Reputation: 11
If you are using QT then you can convert to QString and then myqstring.toStdWString() will do the trick.
Upvotes: 1
Reputation: 7
It's so easy, no need to apply any custom method. Try with this:
string s = "So Easy Bro"
LPCWSTR wide_string;
wide_string = CA2T(s.c_str());
I think, it will works.
Upvotes: -2
Reputation: 864
I prefer using standard converters:
#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();
Please find more details in this answer: https://stackoverflow.com/a/18597384/592651
Update 12/21/2020 : My answer was commented on by @Andreas H . I thought his comment is valuable, so I updated my answer accordingly:
codecvt_utf8_utf16
is deprecated in C++17.- Also the code implies that source encoding is UTF-8 which it usually isn't.
- In C++20 there is a separate type std::u8string for UTF-8 because of that.
But it worked for me because I am still using an old version of C++ and it happened that my source encoding was UTF-8 .
Upvotes: 4
Reputation: 1797
The solution is actually a lot easier than any of the other suggestions:
std::wstring stemp = std::wstring(s.begin(), s.end());
LPCWSTR sw = stemp.c_str();
Best of all, it's platform independent.
Upvotes: 162
Reputation: 27382
If you are in an ATL/MFC environment, You can use the ATL conversion macro:
#include <atlbase.h>
#include <atlconv.h>
. . .
string myStr("My string");
CA2W unicodeStr(myStr);
You can then use unicodeStr as an LPCWSTR. The memory for the unicode string is created on the stack and released then the destructor for unicodeStr executes.
Upvotes: 13