问题描述
我正在尝试从字符串转换为LPCWSTR(我使用多位).
I'm trying to convert from string to LPCWSTR (I use multi-bite).
1)例如:
LPCWSTR ToLPCWSTR(string text)
{
LPCWSTR sw = (LPCWSTR)text.c_str();
return sw;
}
2)这将返回汉字:
LPCWSTR ToLPCWSTR(string text)
{
std::wstring stemp = std::wstring(text.begin(), text.end());
LPCWSTR sw = (LPCWSTR)stemp.c_str();
return sw;
}
但是,它们都始终显示正方形:
However, they both always shows squares:
已编辑:我的代码编辑者:Barmak Shemirani
EDITED:My code with an edit by: Barmak Shemirani
std::wstring get_utf16(const std::string &str, int codepage)
{
if (str.empty()) return std::wstring();
int sz = MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), 0, 0);
std::wstring res(sz, 0);
MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), &res[0], sz);
return res;
}
string HttpsWebRequest(string domain, string url)
{
LPCWSTR sdomain = get_utf16(domain, CP_UTF8).c_str();
LPCWSTR surl = get_utf16(url, CP_UTF8).c_str();
//(Some stuff...)
}
返回: https://i.gyazo.com/ea4cd50765bfcbe12c763ea299e7b508.png
已编辑:使用从UTF8传递到UTF16的另一个代码,结果仍然相同.
EDITED:Using another code that pass from UTF8 to UTF16, still the same result.
std::wstring utf8_to_utf16(const std::string& utf8)
{
std::vector<unsigned long> unicode;
size_t i = 0;
while (i < utf8.size())
{
unsigned long uni;
size_t todo;
bool error = false;
unsigned char ch = utf8[i++];
if (ch <= 0x7F)
{
uni = ch;
todo = 0;
}
else if (ch <= 0xBF)
{
throw std::logic_error("not a UTF-8 string");
}
else if (ch <= 0xDF)
{
uni = ch & 0x1F;
todo = 1;
}
else if (ch <= 0xEF)
{
uni = ch & 0x0F;
todo = 2;
}
else if (ch <= 0xF7)
{
uni = ch & 0x07;
todo = 3;
}
else
{
throw std::logic_error("not a UTF-8 string");
}
for (size_t j = 0; j < todo; ++j)
{
if (i == utf8.size())
throw std::logic_error("not a UTF-8 string");
unsigned char ch = utf8[i++];
if (ch < 0x80 || ch > 0xBF)
throw std::logic_error("not a UTF-8 string");
uni <<= 6;
uni += ch & 0x3F;
}
if (uni >= 0xD800 && uni <= 0xDFFF)
throw std::logic_error("not a UTF-8 string");
if (uni > 0x10FFFF)
throw std::logic_error("not a UTF-8 string");
unicode.push_back(uni);
}
std::wstring utf16;
for (size_t i = 0; i < unicode.size(); ++i)
{
unsigned long uni = unicode[i];
if (uni <= 0xFFFF)
{
utf16 += (wchar_t)uni;
}
else
{
uni -= 0x10000;
utf16 += (wchar_t)((uni >> 10) + 0xD800);
utf16 += (wchar_t)((uni & 0x3FF) + 0xDC00);
}
}
return utf16;
}
推荐答案
如果std::string
源是英语或某些拉丁语言,则可以通过简单的复制转换为std::wstring
(如Miles Budnek的回答所示).但一般来说,您必须使用MultiByteToWideChar
If std::string
source is English or some Latin languages then conversion to std::wstring
can be done with simple copy (as shown in Miles Budnek's answer). But in general you have to use MultiByteToWideChar
std::wstring get_utf16(const std::string &str, int codepage)
{
if (str.empty()) return std::wstring();
int sz = MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), 0, 0);
std::wstring res(sz, 0);
MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), &res[0], sz);
return res;
}
您必须知道用于制作源字符串的代码页.您可以使用GetACP()
查找用户计算机的代码页.如果源字符串为UTF8,则将CP_UTF8
用于代码页.
You have to know the codepage used to make the source string. You can use GetACP()
to find the codepage for user computer. If source string is UTF8 then use CP_UTF8
for codepage.
这篇关于C ++中LPCWSTR的字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!