Udostępnij za pośrednictwem


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 _mbclenjej 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 Zdefiniowane _UNICODE Zdefiniowane
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

Zobacz też

Manipulowanie ciągami
ustawienia regionalne