mbrlen
Určete počet bajtů potřebných k dokončení vícebajtového znaku v aktuálním národním prostředí s možností restartování uprostřed vícebajtového znaku.
Syntaxe
size_t mbrlen(
const char * str,
size_t count,
mbstate_t * mbstate
);
Parametry
str
Ukazatel na další bajt, který chcete zkontrolovat v řetězci vícebajtového znaku.
count
Maximální počet bajtů, které chcete zkontrolovat.
mbstate
Ukazatel na aktuální stav posunu počátečního bajtu str
.
Vrácená hodnota
Jedna z následujících hodnot:
Hodnota | Popis |
---|---|
0 | Další count nebo méně bajtů dokončí vícebajtový znak, který představuje široký znak 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. |
(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. |
(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 nastavená hodnota EILSEQ a stav převodu není mbstate zadaný. |
Poznámky
Funkce mbrlen
kontroluje maximálně count
bajty začínající bajty, na které str
odkazuje, a určí počet bajtů, které jsou nutné k dokončení dalšího vícebajtového znaku, včetně všech posloupností posunu. Je to ekvivalent volání mbrtowc(NULL, str, count, &mbstate)
, kde mbstate
je buď objekt poskytovaný mbstate_t
uživatelem, nebo statický interní objekt poskytovaný knihovnou.
Funkce mbrlen
uloží a použije stav posunu neúplného vícebajtového znaku v parametru mbstate
. Proto se **mbrlen
*může restartovat uprostřed vícebajtového znaku, pokud je to potřeba, a prozkoumat maximálně count
bajty. Pokud mbstate
je ukazatel null, mbrlen
používá interní statický mbstate_t
objekt k uložení stavu směny. Protože interní mbstate_t
objekt není bezpečný pro přístup z více vláken, doporučujeme vždy přidělit a předat vlastní mbstate
parametr.
Funkce mbrlen
se liší od _mbclen
, mblen
_mblen_l
podle jeho restartability. Stav směny 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.
Mapování rutin obecného textu
Rutina TCHAR.H | _UNICODE a _MBCS není definován |
_MBCS definovaný |
_UNICODE definovaný |
---|---|---|---|
nejde použít | nejde použít | mbrlen |
nejde použít |
Požadavky
Rutina | Požadovaný hlavičkový soubor |
---|---|
mbrlen |
<wchar.h> |
Další informace o kompatibilitě najdete v tématu Kompatibilita.
Příklad
Tento příklad ukazuje, jak interpretace vícebajtových znaků závisí na aktuální znakové stránce a ukazuje schopnost mbrlen
obnovení .
// crt_mbrlen.c
// Compile by using: cl crt_mbrlen.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>
size_t Example(const char * pStr)
{
size_t charLen = 0;
size_t charCount = 0;
mbstate_t mbState = {0};
while ((charLen = mbrlen(pStr++, 1, &mbState)) != 0 &&
charLen != (size_t)-1)
{
if (charLen != (size_t)-2) // if complete mbcs char,
{
charCount++;
}
}
return (charCount);
}
int main( void )
{
int cp;
size_t charCount = 0;
const char *pSample =
"\x82\xD0\x82\xE7\x82\xAA\x82\xC8: Shift-jis hiragana.";
cp = _getmbcp();
charCount = Example(pSample);
printf("\nCode page: %d\n%s\nCharacter count: %d\n",
cp, pSample, charCount);
setlocale(LC_ALL, "ja-JP"); // Set Japanese locale
_setmbcp(932); // and Japanese multibyte code page
cp = _getmbcp();
charCount = Example(pSample);
printf("\nCode page: %d\n%s\nCharacter count: %d\n",
cp, pSample, charCount);
}
Code page: 0
é╨éτé¬é╚: Shift-jis hiragana.
Character count: 29
Code page: 932
????: Shift-jis hiragana.
Character count: 25