2009-11-24 139 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; 
}