Namespaces
Variants

std:: mblen

From cppreference.net
Definiert im Header <cstdlib>
int mblen ( const char * s, std:: size_t n ) ;

Bestimmt die Größe in Bytes des Multibyte-Zeichens, dessen erstes Byte auf s zeigt.

Wenn s ein Nullzeiger ist, setzt es den globalen Konvertierungszustand zurück und bestimmt, ob Schiebesequenzen verwendet werden.

Diese Funktion entspricht dem Aufruf std:: mbtowc ( nullptr, s, n ) , mit der Ausnahme, dass der Konvertierungszustand von std::mbtowc unverändert bleibt.

Inhaltsverzeichnis

Hinweise

Jeder Aufruf von mblen aktualisiert den internen globalen Konvertierungsstatus (ein statisches Objekt vom Typ std::mbstate_t , der nur dieser Funktion bekannt ist). Wenn die Multibyte-Kodierung Schaltzustände verwendet, muss darauf geachtet werden, Backtracking oder mehrfaches Scannen zu vermeiden. In jedem Fall sollten mehrere Threads mblen nicht ohne Synchronisierung aufrufen: std::mbrlen kann stattdessen verwendet werden.

Parameter

s - Zeiger auf das Multibyte-Zeichen
n - Begrenzung der Anzahl der Bytes in s, die untersucht werden können

Rückgabewert

Wenn s kein Nullzeiger ist, gibt die Anzahl der Bytes zurück, die im Multibyte-Zeichen enthalten sind, oder - 1 wenn die ersten von s gezeigten Bytes kein gültiges Multibyte-Zeichen bilden, oder 0 wenn s auf das Nullzeichen ' \0 ' zeigt.

Wenn s ein Nullzeiger ist, setzt es seinen internen Konvertierungszustand zurück, um den anfänglichen Shift-Zustand darzustellen, und gibt 0 zurück, wenn die aktuelle Multibyte-Kodierung zustandsunabhängig ist (keine Shift-Sequenzen verwendet), oder einen Wert ungleich Null, wenn die aktuelle Multibyte-Kodierung zustandsabhängig ist (Shift-Sequenzen verwendet).

Beispiel

#include <clocale>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <stdexcept>
#include <string_view>
// die Anzahl der Zeichen in einem Multibyte-String ist die Summe von mblen()
// Hinweis: Der einfachere Ansatz ist std::mbstowcs(nullptr, s.c_str(), s.size())
std::size_t strlen_mb(const std::string_view s)
{
    std::mblen(nullptr, 0); // den Konvertierungsstatus zurücksetzen
    std::size_t result = 0;
    const char* ptr = s.data();
    for (const char* const end = ptr + s.size(); ptr < end; ++result)
    {
        const int next = std::mblen(ptr, end - ptr);
        if (next == -1)
            throw std::runtime_error("strlen_mb(): conversion error");
        ptr += next;
    }
    return result;
}
void dump_bytes(const std::string_view str)
{
    std::cout << std::hex << std::uppercase << std::setfill('0');
    for (unsigned char c : str)
        std::cout << std::setw(2) << static_cast<int>(c) << ' ';
    std::cout << std::dec << '\n';
}
int main()
{
    // ermöglicht mblen() mit UTF-8 Multibyte-Kodierung zu arbeiten
    std::setlocale(LC_ALL, "en_US.utf8");
    // UTF-8 Narrow-Multibyte-Kodierung
    const std::string_view str = "z\u00df\u6c34\U0001f34c"; // oder u8"zß水🍌"
    std::cout << std::quoted(str) << " ist " << strlen_mb(str)
              << " Zeichen, aber so viel wie " << str.size() << " Bytes: ";
    dump_bytes(str);
}

Mögliche Ausgabe:

"zß水🍌" is 4 characters, but as much as 10 bytes: 7A C3 9F E6 B0 B4 F0 9F 8D 8C

Siehe auch

wandelt das nächste Multibyte-Zeichen in ein Breitzeichen um
(Funktion)
gibt die Anzahl der Bytes im nächsten Multibyte-Zeichen unter Berücksichtigung des Zustands zurück
(Funktion)