如何在 C + + (Unicode)中将 std: : string 转换为 LPCWSTR

我正在寻找将 std: : string 转换为 LPCWSTR 的方法或代码片段

217721 次浏览

如果您处于 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 评论了。我认为他的评论很有价值,所以我相应地更新了我的回答:

  1. 在 C + + 17中不推荐使用 codecvt_utf8_utf16
  2. 此外,该代码还暗示源编码是 UTF-8,而它通常不是 UTF-8。
  3. 在 C + + 20中,UTF-8有一个单独的 std: : u8string 类型。

但是它对我很有用,因为我仍然在使用旧版本的 C + + ,而且我的源代码是 UTF-8。

  • 在知道了这一点之后,C + + 11-标准对 .c_str()方法(也许还有 .data())有了规定,允许我们使用 const_cast,

(我的意思是,通常使用 const_cast可能是危险的)

  • 我们可以安全地采取“ const”输入参数。
  • 最后,使用“ const_cast”代替任何不必要的分配和删除。
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)。

这很简单,不需要应用任何自定义的方法。试试这个:

string s = "So Easy Bro"
LPCWSTR wide_string;


wide_string = CA2T(s.c_str());

我觉得会有用的。

如果您使用的是 QT,那么您可以转换为 QString,然后 myqstring.toStdWString ()就可以实现这个功能。