132

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

4

6 回答 6

142

该解决方案实际上比任何其他建议都容易得多:

std::wstring stemp = std::wstring(s.begin(), s.end());
LPCWSTR sw = stemp.c_str();

最重要的是,它独立于平台。

于 2010-11-09T23:12:21.993 回答
13

如果您在 ATL/MFC 环境中,您可以使用 ATL 转换宏:

#include <atlbase.h>
#include <atlconv.h>

. . .

string myStr("My string");
CA2W unicodeStr(myStr);

然后,您可以将 unicodeStr 用作 LPCWSTR。unicode 字符串的内存在堆栈上创建并释放,然后 unicodeStr 的析构函数执行。

于 2008-08-26T02:30:25.013 回答
2

我更喜欢使用标准转换器:

#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


2020 年 12 月 21 日更新:@Andreas H 评论了我的回答。我认为他的评论很有价值,所以我相应地更新了我的答案:

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

但这对我有用,因为我仍在使用旧版本的 C++ 并且碰巧我的源编码是 UTF-8 。

于 2020-10-26T06:39:47.710 回答
1

如果您使用的是 QT,那么您可以转换为 QString,然后 myqstring.toStdWString() 就可以了。

于 2021-07-21T07:58:05.640 回答
1
  • 知道之后,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_UTF8C++ 的字符串文字,但在某些情况下,您可能需要改为使用CP_ACP(通过将第二个参数设置为false)。

于 2021-03-06T16:05:00.103 回答
-1

这很容易,无需应用任何自定义方法。试试这个:

string s = "So Easy Bro"
LPCWSTR wide_string;

wide_string = CA2T(s.c_str());

我想,它会起作用的。

于 2021-05-19T06:14:12.690 回答