mbrtowc
Konvertieren eines Multibytezeichens im aktuellen Gebietsschema in das entsprechende Breitzeichen mit der Möglichkeit des Neustarts in der Mitte eines Multibytezeichens.
Syntax
size_t mbrtowc(
wchar_t *wchar,
const char *mbchar,
size_t count,
mbstate_t *mbstate
);
Parameter
wchar
Adresse eines Breitzeichens für die Aufnahme der konvertierten Breitzeichenfolge (Typ wchar_t
). Dieser Wert kann ein NULL-Zeiger sein, wenn keine Rückgabebreitzeichen erforderlich ist.
mbchar
Adresse einer Sequenz von Bytes (ein Multibytezeichen).
count
Anzahl zu überprüfender Bytes.
mbstate
Zeiger auf das Konvertierungzustandsobjekt. Wenn dieser Wert ein NULL-Zeiger ist, verwendet die Funktion ein statisches internes Konvertierungszustandsobjekt. Da das interne mbstate_t
Objekt nicht threadsicher ist, wird empfohlen, immer Ihr eigenes mbstate
Argument zu übergeben.
Rückgabewert
Einer der folgenden Werte:
0 Die nächsten count
oder weniger Bytes schließen das Multibyte-Zeichen ab, das das breite Nullzeichen darstellt, in dem gespeichert wchar
wird, wenn wchar
es sich nicht um einen Nullzeiger handelt.
1 bis count
einschließlich Die nächsten count
oder weniger Bytes füllen ein gültiges Multibytezeichen aus. Der zurückgegebene Wert ist die Anzahl der Bytes, die das Multybytezeichen abschließen. Die breite Zeichenentsprechung wird gespeichert wchar
, wenn wchar
es sich nicht um einen Nullzeiger handelt.
(size_t) (-1) Es ist ein Codierungsfehler aufgetreten. Die nächsten count
oder weniger Bytes tragen nicht zu einem vollständigen und gültigen Multibytezeichen bei. In diesem Fall wird errno
auf EILSEQ festgelegt, und der Konvertierungsumwandlungszustand in mbstate
ist nicht angegeben.
(size_t) (-2) Die nächsten count
Bytes tragen zu einem unvollständigen, aber potenziell gültigen Multibytezeichen bei, und alle count
Bytes wurden verarbeitet. Kein Wert wird in wchar
gespeichert, aber mbstate
wird so aktualisiert, dass die Funktion neu gestartet wird.
Hinweise
Wenn mbchar
ist ein NULL-Zeiger ist, entspricht die Funktion dem Aufruf:
mbrtowc(NULL, "", 1, &mbstate)
In diesem Fall werden die Werte der wchar
Argumente ignoriert count
.
Wenn mbchar
es sich nicht um einen Nullzeiger handelt, überprüft count
die Funktion Bytes, mbchar
um die erforderliche Anzahl von Bytes zu ermitteln, die zum Abschließen des nächsten Multibytezeichens erforderlich sind. Wenn das nächste Zeichen gültig ist, wird das entsprechende Multibyte-Zeichen gespeichert wchar
, wenn es sich nicht um einen Nullzeiger handelt. Wenn es sich bei dem Zeichen um das entsprechende NULL-Breitzeichen handelt, ist der resultierenden Zustand von mbstate
der ursprüngliche Konvertierungszustand.
Die mbrtowc
Funktion unterscheidet sich von mbtowc
der _mbtowc_l
Neustartbarkeit. Der Konvertierungszustand wird für nachfolgende Aufrufe der gleichen oder anderer Funktionen, die neu gestartet werden können, in mbstate
gespeichert. Wenn sowohl Funktionen, die neu gestartet werden können, als auch Funktionen, die nicht neu gestartet werden könnnen, verwendet werden, sind die Ergebnisse undefiniert. Eine Anwendung sollte beispielsweise wcsrlen
anstelle von wcslen
verwenden, wenn ein nachfolgender Aufruf von wcsrtombs
anstelle von wcstombs
verwendet wird.
Standardmäßig gilt der globale Zustand dieser Funktion für die Anwendung. Wie Sie dieses Verhalten ändern, erfahren Sie unter Globaler Status in der CRT.
Beispiel
Konvertiert ein Multibytezeichen in das entsprechende Breitzeichen.
// crt_mbrtowc.cpp
#include <stdio.h>
#include <mbctype.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>
#define BUF_SIZE 100
int Sample(char* szIn, wchar_t* wcOut, int nMax)
{
mbstate_t state = {0}; // Initial state
size_t nConvResult,
nmbLen = 0,
nwcLen = 0;
wchar_t* wcCur = wcOut;
wchar_t* wcEnd = wcCur + nMax;
const char* mbCur = szIn;
const char* mbEnd = mbCur + strlen(mbCur) + 1;
char* szLocal;
// Sets all locale to French_Canada.1252
szLocal = setlocale(LC_ALL, "French_Canada.1252");
if (!szLocal)
{
printf("The fuction setlocale(LC_ALL, \"French_Canada.1252\") failed!\n");
return 1;
}
printf("Locale set to: \"%s\"\n", szLocal);
// Sets the code page associated current locale's code page
// from a previous call to setlocale.
if (_setmbcp(_MB_CP_SBCS) == -1)
{
printf("The fuction _setmbcp(_MB_CP_SBCS) failed!");
return 1;
}
while ((mbCur < mbEnd) && (wcCur < wcEnd))
{
//
nConvResult = mbrtowc(wcCur, mbCur, 1, &state);
switch (nConvResult)
{
case 0:
{ // done
printf("Conversion succeeded!\nMultibyte String: ");
printf(szIn);
printf("\nWC String: ");
wprintf(wcOut);
printf("\n");
mbCur = mbEnd;
break;
}
case -1:
{ // encoding error
printf("The call to mbrtowc has detected an encoding error.\n");
mbCur = mbEnd;
break;
}
case -2:
{ // incomplete character
if (!mbsinit(&state))
{
printf("Currently in middle of mb conversion, state = %x\n", state);
// state will contain data regarding lead byte of mb character
}
++nmbLen;
++mbCur;
break;
}
default:
{
if (nConvResult > 2) // The multibyte should never be larger than 2
{
printf("Error: The size of the converted multibyte is %d.\n", nConvResult);
}
++nmbLen;
++nwcLen;
++wcCur;
++mbCur;
break;
}
}
}
return 0;
}
int main(int argc, char* argv[])
{
char mbBuf[BUF_SIZE] = "AaBbCc\x9A\x8B\xE0\xEF\xF0xXyYzZ";
wchar_t wcBuf[BUF_SIZE] = {L''};
return Sample(mbBuf, wcBuf, BUF_SIZE);
}
Beispielausgabe
Locale set to: "French_Canada.1252"
Conversion succeeded!
Multibyte String: AaBbCcÜïα∩≡xXyYzZ
WC String: AaBbCcÜïα∩≡xXyYzZ
Anforderungen
Routine | Erforderlicher Header |
---|---|
mbrtowc |
<wchar.h> |
Siehe auch
Datenkonvertierung
Gebietsschema
Interpretation von Multibytezeichensequenzen