Freigeben über


MultiByteToWideChar-Funktion (stringapiset.h)

Ordnet eine Zeichenfolge einer UTF-16 -Zeichenfolge (Breite Zeichen) zu. Die Zeichenfolge stammt nicht unbedingt aus einem Multibyte-Zeichensatz.

Syntax

int MultiByteToWideChar(
  [in]            UINT                              CodePage,
  [in]            DWORD                             dwFlags,
  [in]            _In_NLS_string_(cbMultiByte)LPCCH lpMultiByteStr,
  [in]            int                               cbMultiByte,
  [out, optional] LPWSTR                            lpWideCharStr,
  [in]            int                               cchWideChar
);

Parameter

[in] CodePage

Codeseite, die beim Ausführen der Konvertierung verwendet werden soll. Dieser Parameter kann auf den Wert einer beliebigen Codeseite festgelegt werden, die im Betriebssystem installiert oder verfügbar ist. Eine Liste der Codeseiten finden Sie unter Code Page Identifiers. Ihre Anwendung kann auch einen der in der folgenden Tabelle gezeigten Werte angeben.

Wert Bedeutung
CP_ACP Die Standardmäßige Windows ANSI-Codeseite des Systems.

Anmerkung: Dieser Wert kann auf verschiedenen Computern auch im selben Netzwerk unterschiedlich sein. Sie kann auf demselben Computer geändert werden, was dazu führt, dass gespeicherte Daten unwiederbringlich beschädigt werden. Dieser Wert ist nur für die temporäre Verwendung vorgesehen, und der permanente Speicher sollte UTF-16 oder UTF-8 verwenden, falls möglich.
CP_MACCP Die aktuelle Macintosh-Codeseite (in erster Linie im Legacycode verwendet und wird normalerweise nicht benötigt, da Macintosh-Computer Unicode für die Codierung verwenden).)

Anmerkung: Dieser Wert kann auf verschiedenen Computern auch im selben Netzwerk unterschiedlich sein. Sie kann auf demselben Computer geändert werden, was dazu führt, dass gespeicherte Daten unwiederbringlich beschädigt werden. Dieser Wert ist nur für die temporäre Verwendung vorgesehen, und der permanente Speicher sollte UTF-16 oder UTF-8 verwenden, falls möglich.
CP_OEMCP Die aktuelle OEM-Codeseite des Systems.

Anmerkung: Dieser Wert kann auf verschiedenen Computern auch im selben Netzwerk unterschiedlich sein. Sie kann auf demselben Computer geändert werden, was dazu führt, dass gespeicherte Daten unwiederbringlich beschädigt werden. Dieser Wert ist nur für die temporäre Verwendung vorgesehen, und der permanente Speicher sollte UTF-16 oder UTF-8 verwenden, falls möglich.
CP_SYMBOL Symbolcodeseite (42).
CP_THREAD_ACP Die Windows ANSI-Codeseite für den aktuellen Thread.

Anmerkung: Dieser Wert kann auf verschiedenen Computern auch im selben Netzwerk unterschiedlich sein. Sie kann auf demselben Computer geändert werden, was dazu führt, dass gespeicherte Daten unwiederbringlich beschädigt werden. Dieser Wert ist nur für die temporäre Verwendung vorgesehen, und der permanente Speicher sollte UTF-16 oder UTF-8 verwenden, falls möglich.
CP_UTF7 UTF-7. Verwenden Sie diesen Wert nur, wenn sie durch einen 7-Bit-Transportmechanismus erzwungen wird. Die Verwendung von UTF-8 wird bevorzugt.
CP_UTF8 UTF-8.

[in] dwFlags

Flags, die den Konvertierungstyp angeben. Die Anwendung kann eine Kombination der folgenden Werte angeben, wobei MB_PRECOMPOSED die Standardeinstellung ist. MB_PRECOMPOSED und MB_COMPOSITE schließen sich gegenseitig aus. MB_USEGLYPHCHARS und MB_ERR_INVALID_CHARS können unabhängig vom Status der anderen Flags festgelegt werden.

Wert Bedeutung
MB_COMPOSITE Verwenden Sie immer dekompilierte Zeichen, d. h. Zeichen, in denen ein Basiszeichen und mindestens ein nicht übersteigendes Zeichen unterschiedliche Codepunktwerte aufweisen. Z. B. wird Ä durch A + ̈: LATIN CAPITAL LETTER A (U+0041) + COMBINING DIAERESIS (U+0308) dargestellt. Beachten Sie, dass dieses Flag nicht mit MB_PRECOMPOSED verwendet werden kann.
MB_ERR_INVALID_CHARS Schlägt fehl, wenn ein ungültiges Eingabezeichen aufgetreten ist.

Beginnend mit Windows Vista legt die Funktion keine ungültigen Codepunkte ab, wenn die Anwendung dieses Flag nicht festlegt, sondern ungültige Sequenzen durch U+FFFD ersetzt (entsprechend der angegebenen Codepage codiert).

Windows 2000 mit SP4 und höher, Windows XP: Wenn dieses Kennzeichen nicht festgelegt ist, legt die Funktion im Hintergrund unzulässige Codepunkte ab. Ein Aufruf von GetLastError gibt ERROR_NO_UNICODE_TRANSLATION zurück.
MB_PRECOMPOSED Vorgabe; verwenden Sie nicht mit MB_COMPOSITE. Verwenden Sie immer vorkompilierte Zeichen, d. h. Zeichen mit einem einzelnen Zeichenwert für eine Basis- oder Nicht-Füllzeichenkombination. Im Zeichen "è" ist das Zeichen "e" beispielsweise das Basiszeichen und das Akzent-Graviszeichen das nicht übersteigende Zeichen.For example, the e is the base character and the accent grave mark is the nonspacing character. Wenn ein einzelner Unicode-Codepunkt für ein Zeichen definiert ist, sollte die Anwendung ihn anstelle eines separaten Basiszeichens und eines nicht überstellenden Zeichens verwenden. Beispielsweise wird Ä durch den einzelnen Unicode-Codepunkt LATIN CAPITAL LETTER A WITH DIAERESIS (U+00C4) dargestellt.
MB_USEGLYPHCHARS Verwenden Sie Glyphenzeichen anstelle von Steuerzeichen.

Für die unten aufgeführten Codeseiten muss dwFlags auf .0 Andernfalls schlägt die Funktion mit ERROR_INVALID_FLAGS fehl.

  • 50220
  • 50221
  • 50222
  • 50225
  • 50227
  • 50229
  • 57002 bis 57011
  • 65000 (UTF-7)
  • 42 (Symbol)

Anmerkung

 Für UTF-8 oder Codepage 54936 (GB18030 ab Windows Vista) muss dwFlags entweder 0 oder MB_ERR_INVALID_CHARS festgelegt werden. Andernfalls schlägt die Funktion mit ERROR_INVALID_FLAGS fehl.

[in] lpMultiByteStr

Zeigen Sie auf die zu konvertierende Zeichenfolge.

[in] cbMultiByte

Größe der durch den parameter lpMultiByteStr angegebenen Zeichenfolge in Bytes. Alternativ kann dieser Parameter auf -1 festgelegt werden, wenn die Zeichenfolge null beendet ist. Beachten Sie, dass bei cbMultiByte0ein Fehler auftritt.

Wenn dieser Parameter -1 ist, verarbeitet die Funktion die gesamte Eingabezeichenfolge, einschließlich des endenden NULL-Zeichens. Daher weist die resultierende Unicode-Zeichenfolge ein endendes NULL-Zeichen auf, und die von der Funktion zurückgegebene Länge enthält dieses Zeichen.

Wenn dieser Parameter auf eine positive ganze Zahl festgelegt ist, verarbeitet die Funktion genau die angegebene Anzahl von Bytes. Wenn die angegebene Größe kein endendes NULL-Zeichen enthält, wird die resultierende Unicode-Zeichenfolge nicht null beendet, und die zurückgegebene Länge enthält dieses Zeichen nicht.

[out, optional] lpWideCharStr

Zeiger auf einen Puffer, der die konvertierte Zeichenfolge empfängt.

[in] cchWideChar

Größe des puffers in Zeichen, der durch lpWideCharStr angegeben ist. Wenn dieser Wert lautet 0, gibt die Funktion die erforderliche Puffergröße in Zeichen zurück, einschließlich eines endenden NULL-Zeichens und verwendet nicht den lpWideCharStr-Puffer .

Rückgabewert

Gibt die Anzahl der Zeichen zurück, die in den Puffer geschrieben wurden, der von lpWideCharStr angegeben ist, wenn dies erfolgreich war. Wenn die Funktion erfolgreich ist und cchWideChar lautet, ist 0der Rückgabewert die erforderliche Größe in Zeichen für den puffer, der durch lpWideCharStr angegeben ist. Weitere Informationen dazu, wie sich das MB_ERR_INVALID_CHARS Flag auf den Rückgabewert auswirkt, wenn ungültige Sequenzen eingegeben werden, finden Sie auch unter dwFlags.

Die Funktion gibt zurück 0 , wenn sie nicht erfolgreich ist. Um erweiterte Fehlerinformationen zu erhalten, kann die Anwendung GetLastError aufrufen, wodurch eine der folgenden Fehlercodes zurückgegeben werden kann:

  • ERROR_INSUFFICIENT_BUFFER: Eine angegebene Puffergröße war nicht groß genug, oder sie wurde fälschlicherweise auf NULL.
  • ERROR_INVALID_FLAGS: Die für Flags angegebenen Werte waren ungültig.
  • ERROR_INVALID_PARAMETER: Ungültige Parameterwerte.
  • ERROR_NO_UNICODE_TRANSLATION: Ungültiges Unicode wurde in einer Zeichenfolge gefunden.

Bemerkungen

Das Standardverhalten dieser Funktion besteht darin, in eine vorkompilierte Form der Eingabezeichenzeichenfolge zu übersetzen. Wenn kein vorkompiliertes Formular vorhanden ist, versucht die Funktion, in ein zusammengesetztes Formular zu übersetzen.

Warnung

Die Falsche Verwendung von MultiByteToWideChar kann die Sicherheit Ihrer Anwendung beeinträchtigen. Durch das Aufrufen dieser Funktion kann ein Pufferüberlauf problemlos verursacht werden, da die Größe des eingabepuffers, der durch lpMultiByteStr angegeben ist, der Anzahl der Bytes in der Zeichenfolge entspricht, während die Größe des durch lpWideCharStr angegebenen Ausgabepuffers die Anzahl der Zeichen entspricht. Um einen Pufferüberlauf zu vermeiden, muss ihre Anwendung eine Puffergröße angeben, die für den Datentyp geeignet ist, den der Puffer empfängt. Weitere Informationen finden Sie unter Sicherheitsüberlegungen: Internationale Features.

Die ANSI-Codeseiten können auf verschiedenen Computern unterschiedlich sein oder für einen einzelnen Computer geändert werden, was zu Datenbeschädigungen führt. Für die einheitlichen Ergebnisse sollten Anwendungen Unicode verwenden, z. B. UTF-8 oder UTF-16, anstelle einer bestimmten Codeseite, es sei denn, ältere Standards oder Datenformate verhindern die Verwendung von Unicode. Wenn Die Verwendung von Unicode nicht möglich ist, sollten Anwendungen den Datenstrom mit dem entsprechenden Codierungsnamen markieren, wenn protokolle dies zulassen. HTML- und XML-Dateien ermöglichen tagging, Textdateien jedoch nicht.

Der Ausgabepuffer kann problemlos überlaufen werden, wenn diese Funktion nicht zuerst mit cchWideChar0 aufgerufen wird, um die erforderliche Größe zu erhalten. Wenn das MB_COMPOSITE-Flag verwendet wird, kann die Ausgabe für jedes Eingabezeichen drei oder mehr Zeichen lang sein.

Die Verwendung des MB_PRECOMPOSED-Flags wirkt sich nur sehr wenig auf die meisten Codeseiten aus, da die meisten Eingabedaten bereits erstellt wurden. Erwägen Sie das Aufrufen von NormalizeString nach der Konvertierung mit MultiByteToWideChar. NormalizeString bietet genauere, standardmäßige und konsistentere Daten und kann auch schneller sein. Beachten Sie, dass für die an NormalizeString übergebene NORM_FORM Enumeration NormalizationC MB_PRECOMPOSED und NormalizationD MB_COMPOSITE entspricht.

Die lpMultiByteStr - und lpWideCharStr-Zeiger dürfen nicht identisch sein. Wenn sie identisch sind, schlägt die Funktion fehl, und GetLastError gibt den Wert ERROR_INVALID_PARAMETER zurück.

MultiByteToWideChar beendet keine Ausgabezeichenfolge, wenn die Länge der Eingabezeichenfolge explizit ohne ein beendetes Nullzeichen angegeben wird. Um eine Ausgabezeichenfolge für diese Funktion null zu beenden, sollte die Anwendung -1 übergeben oder explizit das endende NULL-Zeichen für die Eingabezeichenfolge zählen.

Die Funktion schlägt fehl, wenn MB_ERR_INVALID_CHARS festgelegt ist und in der Quellzeichenfolge ein ungültiges Zeichen gefunden wird. Ein ungültiges Zeichen ist eine der folgenden:

  • Ein Zeichen, das nicht das Standardzeichen in der Quellzeichenfolge ist, wird jedoch in das Standardzeichen übersetzt, wenn MB_ERR_INVALID_CHARS nicht festgelegt ist.
  • Für DBCS-Zeichenfolgen ein Zeichen, das ein Leadbyte, aber kein gültiges Trailbyte enthält.

Ab Windows Vista entspricht diese Funktion vollständig der Unicode 4.1-Spezifikation für UTF-8 und UTF-16. Die auf früheren Betriebssystemen verwendete Funktion codiert oder decodiert lone Surrogate-Hälften oder nicht übereinstimmende Ersatzpaare. Code, der in früheren Versionen von Windows geschrieben wurde, die auf diesem Verhalten angewiesen sind, um zufällige binärdaten zu codieren, kann zu Problemen führen. Code, der diese Funktion für gültige UTF-8-Zeichenfolgen verwendet, verhält sich jedoch genauso wie bei früheren Windows-Betriebssystemen.

Windows XP: Um das Sicherheitsproblem der nicht kürzesten Formatversionen von UTF-8 Zeichen zu verhindern, löscht MultiByteToWideChar diese Zeichen.

Ab Windows 8:MultiByteToWideChar wird in Stringapiset.hdeklariert. Vor Windows 8 wurde sie in Winnls.hdeklariert.

Codebeispiel

catch (std::exception e)
{
    // Save in-memory logging buffer to a log file on error.

    ::std::wstring wideWhat;
    if (e.what() != nullptr)
    {
        int convertResult = MultiByteToWideChar(CP_UTF8, 0, e.what(), (int)strlen(e.what()), NULL, 0);
        if (convertResult <= 0)
        {
            wideWhat = L"Exception occurred: Failure to convert its message text using MultiByteToWideChar: convertResult=";
            wideWhat += convertResult.ToString()->Data();
            wideWhat += L"  GetLastError()=";
            wideWhat += GetLastError().ToString()->Data();
        }
        else
        {
            wideWhat.resize(convertResult + 10);
            convertResult = MultiByteToWideChar(CP_UTF8, 0, e.what(), (int)strlen(e.what()), &wideWhat[0], (int)wideWhat.size());
            if (convertResult <= 0)
            {
                wideWhat = L"Exception occurred: Failure to convert its message text using MultiByteToWideChar: convertResult=";
                wideWhat += convertResult.ToString()->Data();
                wideWhat += L"  GetLastError()=";
                wideWhat += GetLastError().ToString()->Data();
            }
            else
            {
                wideWhat.insert(0, L"Exception occurred: ");
            }
        }
    }
    else
    {
        wideWhat = L"Exception occurred: Unknown.";
    }

    Platform::String^ errorMessage = ref new Platform::String(wideWhat.c_str());
    // The session added the channel at level Warning. Log the message at
    // level Error which is above (more critical than) Warning, which
    // means it will actually get logged.
    _channel->LogMessage(errorMessage, LoggingLevel::Error);
    SaveLogInMemoryToFileAsync().then([=](StorageFile^ logFile) {
        _logFileGeneratedCount++;
        StatusChanged(this, ref new LoggingScenarioEventArgs(LoggingScenarioEventType::LogFileGenerated, logFile->Path->Data()));
    }).wait();
}

Beispiel aus universellen Windows-Beispielen auf GitHub.

Anforderungen

Anforderung Wert
Mindestens unterstützter Client Windows 2000 Professional [Desktop-Apps | UWP-Apps]
mindestens unterstützte Server- Windows 2000 Server [Desktop-Apps | UWP-Apps]
Zielplattform- Fenster
Header stringapiset.h (include Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

Siehe auch

Unicode- und Zeichensatzfunktionen

Unicode- und Zeichensätze

WideCharToMultiByte

In VBS-Enklaven verfügbare Vertdll-APIs