mbrtowc
Převede vícebajtový znak v aktuálním národním prostředí na ekvivalentní široký znak s možností restartování uprostřed vícebajtového znaku.
Syntaxe
size_t mbrtowc(
wchar_t *wchar,
const char *mbchar,
size_t count,
mbstate_t *mbstate
);
Parametry
wchar
Adresa širokého znaku pro příjem převedeného řetězce širokého znaku (typ wchar_t
). Tato hodnota může být nulový ukazatel, pokud není vyžadován žádný návratový široký znak.
mbchar
Adresa posloupnosti bajtů (vícebajtový znak).
count
Počet bajtů, které chcete zkontrolovat.
mbstate
Ukazatel na objekt stavu převodu Pokud je tato hodnota ukazatel null, funkce používá statický objekt stavu interního převodu. Protože interní mbstate_t
objekt není bezpečný pro přístup z více vláken, doporučujeme vždy předat vlastní mbstate
argument.
Vrácená hodnota
Jedna z následujících hodnot:
0 Další count
nebo méně bajtů dokončí vícebajtový znak, který představuje široký znak null, který je uložen v wchar
, pokud wchar
není ukazatel null.
1 až count
, včetně Další count
nebo méně bajtů dokončí platný vícebajtový znak. Vrácená hodnota je počet bajtů, které dokončí vícebajtový znak. Ekvivalent širokého znaku je uložen v wchar
, pokud wchar
není nulový ukazatel.
(size_t) (-1) Došlo k chybě kódování. Další count
nebo méně bajtů nepřispívá k úplnému a platnému vícebajtovém znaku. V tomto případě errno
je nastavena hodnota EILSEQ a stav směny převodu není mbstate
zadaný.
(size_t) (-2) Další count
bajty přispívají k neúplné, ale potenciálně platné vícebajtové znaky a všechny count
bajty byly zpracovány. Žádná hodnota se neukládá wchar
, ale mbstate
aktualizuje se, aby se funkce restartoval.
Poznámky
Pokud mbchar
je ukazatel null, funkce je ekvivalentní volání:
mbrtowc(NULL, "", 1, &mbstate)
V tomto případě se hodnoty wchar
argumentů ignorují count
.
Pokud mbchar
není ukazatel null, funkce prozkoumá count
bajty z mbchar
a určí požadovaný počet bajtů, které jsou potřeba k dokončení dalšího vícebajtového znaku. Pokud je další znak platný, uloží se odpovídající vícebajtový znak, wchar
pokud není ukazatelem null. Pokud je znak odpovídajícím širokým znakem null, výsledný stav mbstate
je počáteční stav převodu.
Funkce mbrtowc
se liší od mbtowc
možnosti _mbtowc_l
restartování. Stav převodu se uloží mbstate
pro následná volání stejných nebo jiných restartovatelných funkcí. Výsledky nejsou definovány při kombinování použití restartovatelných a nerestartovatelných funkcí. Například aplikace by měla místo toho, wcsrlen
wcslen
pokud se místo následného volání wcsrtombs
použije wcstombs
.
Ve výchozím nastavení je globální stav této funkce vymezen na aplikaci. Chcete-li toto chování změnit, přečtěte si téma Globální stav v CRT.
Příklad
Převede vícebajtový znak na jeho široký znak ekvivalent.
// 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);
}
Ukázkový výstup
Locale set to: "French_Canada.1252"
Conversion succeeded!
Multibyte String: AaBbCcÜïα∩≡xXyYzZ
WC String: AaBbCcÜïα∩≡xXyYzZ
Požadavky
Rutina | Požadovaný hlavičkový soubor |
---|---|
mbrtowc |
<wchar.h> |
Viz také
Konverze dat
Národní prostředí
Interpretace vícebajtových sekvencí znaků