2009-11-24 22 views
7

Ich habe eine Zeichenfolge in char* Format und möchte es in wchar_t* konvertieren, um zu einer Windows-Funktion zu übergeben.Wie konvertiere ich eine Zeichenkette in eine Zeichenkette wchar_t?

+2

Die meisten Windows-Funktionen tatsächlich in zwei Geschmacksrichtungen, ein „A "und" W "Version. Z.B. MessageBoxA/MessageBoxW, wobei sich ein Makro "MessageBox" auf eines der beiden bezieht. Wenn Sie jedoch den expliziten 'MessageBoxA'-Namen verwenden, können Sie ein' char * 'unabhängig von den Projekteinstellungen übergeben. – MSalters

Antwort

13

Hilft diese kleine Funktion?

#include <cstdlib> 

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

Siehe auch die C++ reference

8

Wenn Sie nicht gegen die C-Laufzeitbibliothek verknüpfen möchten, verwenden Sie die MultiByteToWideChar API-Aufruf, zB:

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

Abhängig davon, woher Ihre Zeichenfolge stammt, möchten Sie vielleicht auch CP_UTF8 anstelle von CP_ACP berücksichtigen. Es kann alle Unicode-Zeichen speichern. – asveikau

+0

Für mich auf Windows10 mit Visual Studio 2017 arbeitete CP_ACP. CP_UTF8 nicht. – netskink

2

das Windows SDK gibt zwei Funktionen in kernel32.lib zum Konvertieren von Strings von und in einen breiten Zeichensatz. diese sind MultiByteToWideChar() und WideCharToMultiByte().

Bitte beachten Sie, dass, anders als der Funktionsname vorgeschlagen, die Zeichenfolge nicht unbedingt einen Multi-Byte-Zeichensatz verwendet, sondern eine einfache ANSI-Zeichenfolge sein kann. Beachten Sie, dass diese Funktionen UTF-7 und UTF-8 als Multi-Byte-Zeichensatz verstehen. Der Zeichensatz mit dem breiten Zeichensatz ist immer UTF-16.

1

schnaader Antwort die Umwandlung von der aktuellen locale C definiert verwenden, verwendet dieses die C++ locale-Schnittstelle (der sagte, dass es war einfach?)

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; 
} 
Verwandte Themen