mbstowcs, mbstowcs_s
Von de.cppreference.net
| Definiert in Header <stdlib.h>
|
||
size_t mbstowcs( wchar_t* dst, const char* src, size_t len)
|
(1) | (bis C99) |
size_t mbstowcs( wchar_t* restrict dst, const char* restrict src, size_t len)
|
(seit C99) | |
errno_t mbstowcs_s(size_t* restrict retval, wchar_t* restrict dst,
rsize_t dstsz, const char* restrict src, rsize_t len);
|
(2) | (seit C11) |
1) Konvertiert eine Multibyte-Zeichenkette aus dem Feld, auf dessen erstes Element
src zeigt, in ihre Weitzeichendarstellung. Die konvertierten Zeichen werden in den aufeinanderfolgenden Elementen des Feldes gespeichert, auf das dst zeigt. Es werden maximal len Weitzeichen in das Zielfeld geschrieben. Jedes Zeichen wird wie durch einen Aufruf von mbtowc konvertiert, mit der Ausnahme, dass der mbtowc-Konvertierungszustand nicht beeinflusst wird. Die Konvertierung stoppt, wenn:
- Das Multibyte-Nullzeichen konvertiert und gespeichert wurde.
- Ein ungültiges (in der aktuellen C-Locale) Multibyte-Zeichen gefunden wurde.
- Das nächste zu speichernde Weitzeichen
lenüberschreiten würde.
Wenn
src und dst überlappen, ist das Verhalten undefiniert2) Wie (1), mit dem Unterschied, dass
- die Konvertierung wie durch mbrtowc erfolgt, nicht durch mbtowc
- die Funktion ihr Ergebnis als Ausgabeparameter
retval - zurückgibtwenn kein Nullzeichen in
dstgeschrieben wurde, nachdemlenWeitzeichen geschrieben wurden, dann wirdL'\0'indst[len]gespeichert, also insgesamt len+1 Weitzeichen geschrieben - wenn
dstein Nullzeiger ist, wird die Anzahl der Weitzeichen, die erzeugt worden wären, in*retval - gespeichertdie Funktion überschreibt das Zielfeld vom abschließenden Nullzeichen bis
dstsz - Wenn
srcunddstüberlappen, ist das Verhalten unspezifiziert. - die folgenden Fehler werden zur Laufzeit erkannt und rufen die aktuell installierte Einschränkungshandler-Funktion auf:
retvalodersrcist ein Nullzeigerdstszoderlenist größer als RSIZE_MAX / sizeof(wchar_t) (außer wenndstnull ist)dstszist nicht Null (außer wenndstnull ist)- Es gibt kein Nullzeichen in den ersten
dstszMultibyte-Zeichen imsrc-Feld undlenist größer alsdstsz(außer wenndstnull ist)
- Wie bei allen geprüften Funktionen ist
mbstowcs_snur garantiert verfügbar, wenn__STDC_LIB_EXT1__von der Implementierung definiert ist und der Benutzer__STDC_WANT_LIB_EXT1__als Integer-Konstante1vor dem Einbinden von <stdlib.h> definiert.
Anmerkungen
In den meisten Implementierungen aktualisiert mbstowcs ein globales statisches Objekt vom Typ mbstate_t, während es die Zeichenkette verarbeitet, und kann nicht gleichzeitig von zwei Threads aufgerufen werden. In solchen Fällen sollte mbsrtowcs verwendet werden.
POSIX spezifiziert eine verbreitete Erweiterung: Wenn dst ein Nullzeiger ist, gibt diese Funktion die Anzahl der Weitzeichen zurück, die in dst geschrieben worden wären, wenn konvertiert. Ähnliches Verhalten ist Standard für mbstowcs_s und für mbsrtowcs.
Parameter
| dst | - | Zeiger auf das Weitzeichenfeld, in dem die Weitzeichenkette gespeichert wird |
| src | - | Zeiger auf das erste Element einer nullterminierten Multibyte-Zeichenkette, die konvertiert werden soll |
| len | - | Anzahl der im Feld, auf das dst zeigt, verfügbaren Weitzeichen |
| dstsz | - | maximale Anzahl der Weitzeichen, die geschrieben werden (Größe des dst-Feldes)
|
| retval | - | Zeiger auf ein size_t-Objekt, in dem das Ergebnis gespeichert wird |
Rückgabewert
1) Bei Erfolg wird die Anzahl der Weitzeichen (ohne das abschließende
L'\0') zurückgegeben, die in das Zielfeld geschrieben wurden. Bei Konvertierungsfehler (falls ein ungültiges Multibyte-Zeichen gefunden wurde) wird (size_t)-1 zurückgegeben.2) Null bei Erfolg (in diesem Fall wird die Anzahl der Weitzeichen ohne abschließende Null, die in
dst geschrieben wurden oder geschrieben worden wären, in *retval gespeichert), bei Fehler ungleich Null. Im Falle einer Laufzeit-Einschränkungsverletzung wird (size_t)-1 in *retval gespeichert (außer wenn retval null ist) und dst[0] auf L'\0' gesetzt (außer wenn dst null ist oder dstmax Null oder größer als RSIZE_MAX ist)Beispiel
Diesen Code ausführen
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
int main(void)
{
setlocale(LC_ALL, "en_US.utf8");
const char* mbstr = u8"z\u00df\u6c34\U0001F34C"; // or u8"zß水🍌"
wchar_t wstr[5];
mbstowcs(wstr, mbstr, 5);
wprintf(L"MB string: %s\n", mbstr);
wprintf(L"Wide string: %ls\n", wstr);
}
Ausgabe:
MB string: zß水🍌
Wide string: zß水🍌
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
- 7.22.8.1 Die Funktion mbstowcs (S. TBD)
- K.3.6.5.1 Die Funktion mbstowcs_s (S. TBD)
- C17-Standard (ISO/IEC 9899:2018):
- 7.22.8.1 Die Funktion mbstowcs (S. TBD)
- K.3.6.5.1 Die Funktion mbstowcs_s (S. TBD)
- C11-Standard (ISO/IEC 9899:2011):
- 7.22.8.1 Die Funktion mbstowcs (S. 359)
- K.3.6.5.1 Die Funktion mbstowcs_s (S. 611-612)
- C99-Standard (ISO/IEC 9899:1999):
- 7.20.8.1 Die Funktion mbstowcs (S. 323)
- C89/C90-Standard (ISO/IEC 9899:1990):
- 4.10.8.1 Die Funktion mbstowcs
Siehe auch
(C95)(C11) |
konvertiert eine schmale Multibyte-Zeichenkette in eine Weitzeichenkette, unter Berücksichtigung des Zustands (Funktion) |
(C11) |
konvertiert eine Weitzeichenkette in eine schmale Multibyte-Zeichenkette (Funktion) |
C++-Dokumentation für mbstowcs
| |