我正在寻找将 std::string 转换为 LPCWSTR 的方法或代码片段
Toran Billups
问问题
205239 次
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 评论了我的回答。我认为他的评论很有价值,所以我相应地更新了我的答案:
codecvt_utf8_utf16
在 C++17 中已弃用。- 此外,代码暗示源编码是 UTF-8,而它通常不是。
- 因此,在 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_UTF8
C++ 的字符串文字,但在某些情况下,您可能需要改为使用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 回答