如何将 std::string 转换为 WCHAR
Posted
技术标签:
【中文标题】如何将 std::string 转换为 WCHAR【英文标题】:How to convert std::string to WCHAR 【发布时间】:2016-10-08 00:39:22 【问题描述】:我需要获取我拥有的 std::string 并将其转换为 WCHAR 有人知道该怎么做吗?任何帮助表示赞赏
【问题讨论】:
wchar_t
用于存储宽字符,wstring
用于存储宽字符串。无法将string
转换为wchar_t
,您的意思是要将string
转换为wstring
还是wchar_t*
?
只需使用 [] 运算符访问字符并进行转换。
【参考方案1】:
您的问题含糊不清; wchar_t
用于存储宽字符,wstring
用于存储宽字符串。您无法将 string
转换为 wchar_t
。
但如果您的目标是将std::string
转换为wchar_t*
,那么您需要先将std::string
转换为std::wstring
,然后再将std::wstring
转换为const wchar_t*
。
string narrow_string("A string");
wstring wide_string = wstring(narrow_string.begin(), narrow_string.end());
const wchar_t* result = wide_string.c_str();
【讨论】:
这只适用于 ASCII 字符。在实践中。 想一想,即使是 ASCII 也是不正确的,例如Big-5 愉快地重叠。【参考方案2】:假设您想要从语言环境编码转换,因为您想要wchar_t。
选项 1,自 C++11 开始,但在 C++17 中已弃用:
// See https://***.com/questions/41744559
template<class I, class E, class S>
struct codecvt_ : std::codecvt<I, E, S> ~codecvt_ () ;
std::wstring to_wide (const std::string &multi)
return std::wstring_convert<codecvt_<wchar_t, char, mbstate_t>>
.from_bytes (multi);
选项 2,可广泛移植:
std::wstring to_wide (const std::string &multi)
std::wstring wide; wchar_t w; mbstate_t mb ;
size_t n = 0, len = multi.length () + 1;
while (auto res = mbrtowc (&w, multi.c_str () + n, len - n, &mb))
if (res == size_t (-1) || res == size_t (-2))
throw "invalid encoding";
n += res;
wide += w;
return wide;
【讨论】:
以上是关于如何将 std::string 转换为 WCHAR的主要内容,如果未能解决你的问题,请参考以下文章
我想将 std::string 转换为 const wchar_t *
我想将std :: string转换为const wchar_t *
VS错误C++:不存在从 "WCHAR [260]" 转换到 "std::basic_string<char," 的适当构造函数
从‘std::wstring aka std::basic_string<wchar_t>’到非标量类型‘UString aka std::basic_string<char>