Freigeben über


mbrlen

Bestimmen der Anzahl der Bytes, die zum Ausführen eines Multibytezeichens im aktuellen Gebietsschemas erforderlich sind, mit der Möglichkeit des Neustarts in der Mitte eines Multibytezeichens.

Syntax

size_t mbrlen(
   const char * str,
   size_t count,
   mbstate_t * mbstate
);

Parameter

str
Zeiger auf das nächste Byte, das in einer Multibytezeichenfolge überprüft werden soll.

count
Die maximale Anzahl der zu überprüfenden Bytes.

mbstate
Zeiger auf den aktuellen Umschaltzustand des ersten Bytes von str.

Rückgabewert

Einer der folgenden Werte:

Wert Beschreibung
0 Die nächsten count oder weniger Bytes schließen das Multibytezeichen ab, das Null-Breitzeichen darstellt.
1 bis count, inklusive Die nächsten count oder weniger Bytes schließen ein gültiges Multibytezeichen ab. Der zurückgegebene Wert ist die Anzahl der Bytes, die das Multybytezeichen abschließen.
(size_t)(-2) Die nächsten count Bytes tragen zu einem unvollständigen, jedoch möglicherweise gültigen Multibytezeichen bei und alle count Bytes wurden verarbeitet.
(size_t)(-1) Es ist ein Codierungsfehler aufgetreten. Die nächsten count oder weniger Bytes tragen nicht zu einem vollständigen und gültigen Multibytezeichen bei. In diesem Fall wird errno auf EILSEQ festgelegt, und der Konvertierungszustand in mbstate ist nicht angegeben.

Hinweise

Die mbrlen-Funktion prüft höchstens count Bytes, beginnend mit dem Byte, auf das von str gezeigt wird, um die Anzahl von Bytes zu bestimmen, die zum Abschließen des nächsten Multibytezeichens, einschließlich aller Umwandlungssequenzen, erforderlich sind. Es entspricht dem Aufruf mbrtowc(NULL, str, count, &mbstate) , bei dem mbstate es sich entweder um ein vom Benutzer bereitgestelltes mbstate_t Objekt oder um ein statisches internes Objekt handelt, das von der Bibliothek bereitgestellt wird.

Die mbrlen-Funktion speichert und verwendet Umschaltzustand eines unvollständigen Multibytezeichens im mbstate-Parameter. Aus diesem Grund kann **mbrlen**bei Bedarf in der Mitte eines Multibyte-Zeichens neu gestartet werden und die meisten count Bytes untersuchen. Wenn mbstate ein NULL-Zeiger ist, verwendet mbrlen ein internes, statisches mbstate_t-Objekt zum Speichern des Umschaltzustands. Da das interne mbstate_t Objekt nicht threadsicher ist, empfehlen wir, dass Sie immer Ihren eigenen mbstate Parameter zuordnen und übergeben.

Die mbrlen Funktion unterscheidet sich von _mbclen, mblen_mblen_l durch die Neustartbarkeit. Der Umschaltzustand wird für nachfolgende Aufrufe der gleichen oder anderer Funktionen, die neu gestartet werden können, in mbstate gespeichert. Wenn sowohl Funktionen, die neu gestartet werden können, als auch Funktionen, die nicht neu gestartet werden könnnen, verwendet werden, sind die Ergebnisse undefiniert. Eine Anwendung sollte beispielsweise wcsrlen anstelle von wcslen verwenden, wenn ein nachfolgender Aufruf von wcsrtombs anstelle von wcstombs verwendet wird.

Standardmäßig gilt der globale Zustand dieser Funktion für die Anwendung. Informationen zum Ändern dieses Verhaltens finden Sie im Global state in the CRT.

Generische Textroutinzuordnungen

TCHAR.H-Routine _UNICODE und _MBCS nicht definiert _MBCS Definiert _UNICODE Definiert
nicht zutreffend nicht zutreffend mbrlen nicht zutreffend

Anforderungen

Routine Erforderlicher Header
mbrlen <wchar.h>

Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.

Beispiel

Dieses Beispiel zeigt, inwiefern die Interpretation von Multibytezeichen von der aktuellen Codepage abhängig ist, und demonstriert die Funktion zum Fortsetzen von 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

Siehe auch

Zeichenfolgenmanipulation
Gebietsschema