如何将 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 *

wchar_t*转换string

VS错误C++:不存在从 "WCHAR [260]" 转换到 "std::basic_string<char," 的适当构造函数

从‘std::wstring aka std::basic_string<wchar_t>’到非标量类型‘UString aka std::basic_string<char>

std:string怎么转wchar