2009-11-24 138 views
7

我有一个char*格式的字符串,并且想将它转换为wchar_t*,以传递给Windows函数。如何将char字符串转换为wchar_t字符串?

+2

大多数Windows功能实际上有两种版本,一种是“A “和”W“版本。例如。 MessageBoxA/MessageBoxW,带有一个宏“MessageBox”,指向其中一个。但是,如果您使用明确的'MessageBoxA'名称,则可以独立于项目设置传递'char *'。 – MSalters 2009-11-26 14:27:54

回答

13

这个小功能有帮助吗?

#include <cstdlib> 

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

另见C++ reference

8

如果你不想对C运行时库链接,使用的MultiByteToWideChar API调用,例如:

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

根据字符串来自哪里,您可能还想考虑CP_UTF8而不是CP_ACP。它可以存储所有的Unicode字符。 – asveikau 2009-11-24 17:47:52

+0

对于使用visual studio 2017的windows10,CP_ACP工作。 CP_UTF8没有。 – netskink 2017-06-28 12:35:50

2

Windows SDK中指定2个功能在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; 
}