I'm looking for a method, or a code snippet for converting std::string to LPCWSTR
I'm looking for a method, or a code snippet for converting std::string to LPCWSTR
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.
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_utf16is 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 .
.c_str() method (maybe .data() too), which allows us to use const_cast,(I mean, normally using
const_castmay 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_UTF8for C++'s string-literal, but in some cases you may need to instead useCP_ACP(by setting second parameter tofalse).
If you are using QT then you can convert to QString and then myqstring.toStdWString() will do the trick.
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.