【问题标题】:How to convert std::string to WCHAR如何将 std::string 转换为 WCHAR
【发布时间】:2016-10-08 00:39:22
【问题描述】:

我需要获取我拥有的 std::string 并将其转换为 WCHAR 有人知道该怎么做吗?任何帮助表示赞赏

【问题讨论】:

  • wchar_t 用于存储宽字符,wstring 用于存储宽字符串。无法将string 转换为wchar_t,您的意思是要将string 转换为wstring 还是wchar_t*?
  • 只需使用 [] 运算符访问字符并进行转换。

标签: c++ string type-conversion


【解决方案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://stackoverflow.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;
}

【讨论】:

    猜你喜欢
    • 2012-04-29
    • 2017-04-08
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2016-01-28
    相关资源
    最近更新 更多