mbrtowc
Převeďte více znak v aktuální národní prostředí ekvivalentní široký znak s možností restartování uprostřed více znaků.
size_t mbrtowc( wchar_t *wchar, const char *mbchar, size_t count, mbstate_t *mbstate );
Parametry
wchar
Adresa široký znak přijímat řetězec převedený širokého znaku (typ wchar_t).Tato hodnota může být ukazatel s hodnotou null, pokud žádné návratový široký znak je povinný.mbchar
Adresa sekvenci bajtů (více znaků).count
Počet bajtů, které mají být zkontrolována.mbstate
Ukazatel na objekt stavu převodu.Pokud je tato hodnota ukazatel s hodnotou null, funkce používá objekt stavu statické vnitřní převodu.Protože interní mbstate_t objekt není vláken, doporučujeme, aby vždy předáte vlastní mbstate argument.
Vrácená hodnota
Jeden z následujících hodnot:
0
Další count nebo méně bajtů dokončit více znak, který představuje hodnotu null širokého znaku, který je uložen v wchar, je-li wchar není ukazatel s hodnotou null.1 count, včetně
Další count nebo méně bajtů dokončení platný více znak.Hodnota vrácená je počet bajtů, které dokončit více znaků.Široký znak, který je ekvivalentní je uložena v wchar, je-li wchar není ukazatel s hodnotou null.(size_t)(-1)
Došlo k chybě kódování.Další count nebo méně bajtů není k němu přispět úplnou a platnou více znaků.V takovém případě errno je nastavena na EILSEQ a stav shift převod v mbstate neurčená.(size_t)-(2)
Další count bajtů přispívají k nekompletní, ale potenciálně platný více znaků a všechny count byly zpracovány bajtů.Není uložena žádná hodnota v wchar, ale mbstate aktualizována tak, aby restartovat funkce.
Poznámky
Pokud mbchar je ukazatel s hodnotou null, je ekvivalentní volání funkce:
mbrtowc(NULL, "", 1, &mbstate)
V tomto případě hodnotu argumentů wchar a count jsou ignorovány.
Pokud mbchar není ukazatel s hodnotou null, prozkoumá funkce count bajtů z mbchar k určení požadovaný počet bajtů, které jsou nezbytné pro dokončení více další znak.Je-li další znak je platný, odpovídající více znak je uložena v wchar nemá-li ukazatel s hodnotou null.Pokud je znak odpovídající široký null znaku, výsledný stav mbstate je stav počáteční převod.
mbrtowc Funkce se liší od mbtowc, _mbtowc_l podle jeho restartability.Stav převodu je uložen v mbstate pro následné volání stejné nebo jiné funkce s možností restartování.Výsledky nedefinované při použití s možností restartování a nonrestartable funkcí.Například by měla použít aplikace wcsrlen namísto wcslen -li následných volání wcsrtombs se používá místo wcstombs.
Příklad
Převede více znak na jeho ekvivalentní širokého znaku.
// 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);
}
Vzorový 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 > |
Ekvivalent v rozhraní .NET Framework
Nelze použít. Pokud chcete volat standardní funkci jazyka C, použijte PInvoke. Další informace naleznete v tématu příklady vyvolat platformy.