Tôi đang tìm một phương pháp hoặc một đoạn mã để chuyển đổi std :: string thành LPCWSTR
Tôi đang tìm một phương pháp hoặc một đoạn mã để chuyển đổi std :: string thành LPCWSTR
Câu trả lời:
Cảm ơn liên kết đến bài báo MSDN. Điều này thật đúng với gì mà tôi đã tìm kiếm.
std::wstring s2ws(const std::string& s)
{
int len;
int slength = (int)s.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
std::wstring r(buf);
delete[] buf;
return r;
}
std::wstring stemp = s2ws(myString);
LPCWSTR result = stemp.c_str();
Giải pháp thực sự dễ dàng hơn rất nhiều so với bất kỳ đề xuất nào khác:
std::wstring stemp = std::wstring(s.begin(), s.end());
LPCWSTR sw = stemp.c_str();
Hơn hết, nó độc lập với nền tảng. h2h :)
reinterpret_cast
. Mã này không hoạt động. Không được dùng. .
char
thường được mã hóa là ANSI. Với mã hóa ANSI, các giá trị từ 128 đến 255 được diễn giải bằng cách sử dụng trang mã hiện đang hoạt động. Việc chuyển các giá trị đó vào một wchar_t
(mã hóa UTF-16 trên Windows) sẽ không tạo ra kết quả mong muốn. Nếu bạn muốn chính xác, điều này hoạt động chính xác trong 50% trường hợp. Có tính đến mã hóa ký tự DBCS, tỷ lệ phần trăm đó giảm thêm.
Nếu bạn đang ở trong môi trường ATL / MFC, Bạn có thể sử dụng macro chuyển đổi ATL:
#include <atlbase.h>
#include <atlconv.h>
. . .
string myStr("My string");
CA2W unicodeStr(myStr);
Sau đó, bạn có thể sử dụng unicodeStr làm LPCWSTR. Bộ nhớ cho chuỗi unicode được tạo trên ngăn xếp và được giải phóng sau đó hàm hủy cho unicodeStr thực thi.
Thay vì sử dụng std :: string, bạn có thể sử dụng std :: wstring.
CHỈNH SỬA: Xin lỗi, điều này không giải thích được nhiều hơn, nhưng tôi phải chạy.
Sử dụng std :: wstring :: c_str ()
string myMessage="helloworld";
int len;
int slength = (int)myMessage.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, 0, 0);
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, buf, len);
std::wstring r(buf);
std::wstring stemp = r.C_str();
LPCWSTR result = stemp.c_str();
LPCWSTR lpcwName = std :: wstring (strname.begin (), strname.end ()). C_str ()