如何将char字符串转换为wchar_t字符串?

12

我有一个以 char* 格式表示的字符串,并希望将其转换为 wchar_t*,以便传递给 Windows 函数。


4
大多数 Windows 功能实际上有两种版本,即 "A" 版本和 "W" 版本。例如,MessageBoxA / MessageBoxW,使用宏 "MessageBox" 可以引用其中之一。但是,如果您使用显式的 MessageBoxA 名称,可以在不受项目设置限制的情况下传递 char* - MSalters
4个回答

19

这个小函数有帮助吗?

#include <cstdlib>

int mbstowcs(wchar_t *out, const char *in, size_t size);

还可参阅C++参考文献


该函数已弃用。 - user2498772

16

如果你不想链接C运行库,可以使用MultiByteToWideChar API调用,例如:

const size_t WCHARBUF = 100;
const char szSource[] = "HELLO";
wchar_t  wszDest[WCHARBUF];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szSource, -1, wszDest, WCHARBUF);

4
根据您的字符串来源,您可能还需要考虑使用CP_UTF8而不是CP_ACP。它可以存储所有Unicode字符。 - asveikau
1
对于我在Windows10上使用Visual Studio 2017,CP_ACP有效。CP_UTF8无效。 - netskink

2
Windows SDK指定了两个函数在kernel32.lib中用于将字符串从宽字符集转换为多字节字符集和从多字节字符集转换为宽字符集。这些函数是MultiByteToWideChar()WideCharToMultiByte()
请注意,与函数名称所示不同,该字符串不一定使用多字节字符集,而可以是简单的ANSI字符串。另外,请注意这些函数理解UTF-7和UTF-8作为多字节字符集。宽字符集始终为UTF-16。

1

schnaader的答案使用当前C语言环境定义的转换方式,而这个答案使用了C++语言环境接口(谁说它简单了?)

std::wstring widen(std::string const& s, std::locale loc)
{
    std::char_traits<wchar_t>::state_type state = { 0 };

    typedef std::codecvt<wchar_t, char, std::char_traits<wchar_t>::state_type >
        ConverterFacet;

    ConverterFacet const& converter(std::use_facet<ConverterFacet>(loc));

    char const* nextToRead = s.data();
    wchar_t buffer[BUFSIZ];
    wchar_t* nextToWrite;
    std::codecvt_base::result result;
    std::wstring wresult;

    while ((result
            = converter.in
                  (state,
                   nextToRead, s.data()+s.size(), nextToRead,
                   buffer, buffer+sizeof(buffer)/sizeof(*buffer), nextToWrite))
           == std::codecvt_base::partial)
    {
        wresult.append(buffer, nextToWrite);
    }

    if (result == std::codecvt_base::error) {
        throw std::runtime_error("Encoding error");
    }
    wresult.append(buffer, nextToWrite);
    return wresult;
}

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