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. Wie Sie dieses Verhalten ändern, erfahren Sie unter Globaler Status in der CRT.
Mapping generischer Textroutinen
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