如何将std::string转换为WCHAR

6
我需要将某个 std::string 转换为 WCHAR,请问有人知道怎么做吗?感谢任何帮助。

wchar_t 用于存储宽字符,而 wstring 用于存储宽字符串。您不能将 string 转换为 wchar_t,您是想将 string 转换为 wstring 还是 wchar_t* - Mo Abdul-Hameed
只需使用[]运算符和强制转换即可访问字符。 - Malcolm McLean
2个回答

9
您的问题比较模糊;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();

1
这仅适用于ASCII字符。在实践中。 - Přemysl J.
想一想,即使是ASCII也是不正确的,例如Big-5可以愉快地重叠。 - Přemysl J.

1
假设您想从区域编码转换,因为您需要wchar_t
选项1:自C++11以来已过时,但在C++17中被弃用:
// See https://dev59.com/Q1gR5IYBdhLWcg3wGaEK
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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接