mbrlen
Określ liczbę bajtów, które są wymagane do ukończenia wielobajtowego znaku w bieżących ustawieniach regionalnych, z możliwością ponownego uruchamiania w środku znaku wielobajtowego.
Składnia
size_t mbrlen(
const char * str,
size_t count,
mbstate_t * mbstate
);
Parametry
str
Wskaźnik do następnego bajtu, aby sprawdzić w ciągu znaków wielobajtowych.
count
Maksymalna liczba bajtów do sprawdzenia.
mbstate
Wskaźnik do bieżącego stanu przesunięcia początkowego bajtu .str
Wartość zwracana
Jedna z następujących wartości:
Wartość | Opis |
---|---|
0 | count Następne lub mniej bajtów kończy znak wielobajtowy, który reprezentuje szeroki znak null. |
Od 1 do count , włącznie |
count Następne lub mniej bajtów kończy prawidłowy znak wielobajtowy. Zwracana wartość to liczba bajtów, które zakończą znak wielobajtowy. |
(size_t)(-2) | count Następne bajty przyczyniają się do niekompletnego, ale potencjalnie prawidłowego znaku wielobajtowego i wszystkich count bajtów zostały przetworzone. |
(size_t)(-1) | Wystąpił błąd kodowania. count Kolejne lub mniejsze bajty nie przyczyniają się do kompletnego i prawidłowego znaku wielobajtowego. W tym przypadku jest ustawiona wartość EILSEQ, errno a stan konwersji w mbstate elemecie jest nieokreślony. |
Uwagi
Funkcja mbrlen
sprawdza najwyżej count
bajty rozpoczynające się od bajtu wskazywanego przez str
, aby określić liczbę bajtów, które są wymagane do ukończenia następnego znaku wielobajtowego, w tym wszystkich sekwencji przesunięcia. Jest to odpowiednik wywołania mbrtowc(NULL, str, count, &mbstate)
, w którym mbstate
jest obiektem udostępnianym mbstate_t
przez użytkownika lub statycznym obiektem wewnętrznym udostępnianym przez bibliotekę.
Funkcja mbrlen
zapisuje i używa stanu przesunięcia niekompletnego znaku wielobajtowego w parametrze mbstate
. Dlatego **mbrlen
**może ponownie uruchomić się w środku znaku wielobajtowego, jeśli jest to konieczne, i zbadać w większości count
bajtów. Jeśli mbstate
jest wskaźnikiem o wartości null, mbrlen
używa wewnętrznego, statycznego mbstate_t
obiektu do przechowywania stanu przesunięcia. Ponieważ obiekt wewnętrzny mbstate_t
nie jest bezpieczny wątkowo, zalecamy zawsze przydzielanie i przekazywanie własnego mbstate
parametru.
Funkcja mbrlen
różni się od funkcji , mblen
_mblen_l
przez _mbclen
jej możliwość ponownego uruchamiania. Stan zmiany jest przechowywany mbstate
dla kolejnych wywołań do tych samych lub innych funkcji możliwych do ponownego uruchomienia. Wyniki są niezdefiniowane podczas mieszania funkcji możliwych do ponownego uruchomienia i niezwiązanych z uruchamianiem. Na przykład aplikacja powinna używać wcsrlen
zamiast wcslen
, jeśli kolejne wywołanie wcsrtombs
metody jest używane zamiast wcstombs
.
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Mapowania procedur tekstu ogólnego
Procedura TCHAR.H | _UNICODE i _MBCS niezdefiniowane |
_MBCS zdefiniowany |
_UNICODE zdefiniowany |
---|---|---|---|
nie dotyczy | nie dotyczy | mbrlen |
nie dotyczy |
Wymagania
Procedura | Wymagany nagłówek |
---|---|
mbrlen |
<wchar.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
W tym przykładzie pokazano, jak interpretacja znaków wielobajtowych zależy od bieżącej strony kodowej i pokazuje możliwość wznowienia funkcji mbrlen
.
// 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