std::mblen
| Definiert in Header <cstdlib> |
||
| int mblen( const char* s, std::size_t n ); |
||
Ermittelt die Größe, in Bytes, des Multibyte-Zeichens, dessen erstes Byte von s gezeigt wird.
Wenn s ein Nullzeiger ist, wird der globale Konvertierungszustand zurückgesetzt und ermittelt, ob Umschaltsequenzen verwendet werden.
Diese Funktion ist äquivalent zum Aufruf std::mbtowc(nullptr, s, n), außer dass der Konvertierungszustand von std::mbtowc unberührt bleibt.
Inhalt |
[bearbeiten] Hinweise
Jeder Aufruf von mblen aktualisiert den internen globalen Konvertierungszustand (ein statisches Objekt vom Typ std::mbstate_t, nur dieser Funktion bekannt). Wenn die Multibyte-Kodierung Umschaltzustände verwendet, muss darauf geachtet werden, Rückschritte oder mehrfache Scans zu vermeiden. In jedem Fall sollten mehrere Threads mblen nicht ohne Synchronisation aufrufen: std::mbrlen kann stattdessen verwendet werden.
[bearbeiten] Parameter
| s | - | Zeiger auf das Multibyte-Zeichen |
| n | - | Grenze für die Anzahl der Bytes in s, die untersucht werden können |
[bearbeiten] 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, wird sein interner Konvertierungszustand zurückgesetzt, um den anfänglichen Umschaltzustand darzustellen, und gibt 0 zurück, wenn die aktuelle Multibyte-Kodierung nicht zustandsabhängig ist (keine Umschaltsequenzen verwendet) oder einen Wert ungleich Null, wenn die aktuelle Multibyte-Kodierung zustandsabhängig ist (Umschaltsequenzen verwendet).
[bearbeiten] Beispiel
#include <clocale> #include <cstdlib> #include <iomanip> #include <iostream> #include <stdexcept> #include <string_view> // the number of characters in a multibyte string is the sum of mblen()'s // note: the simpler approach is std::mbstowcs(nullptr, s.c_str(), s.size()) std::size_t strlen_mb(const std::string_view s) { std::mblen(nullptr, 0); // reset the conversion state 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() { // allow mblen() to work with UTF-8 multibyte encoding std::setlocale(LC_ALL, "en_US.utf8"); // UTF-8 narrow multibyte encoding const std::string_view str = "z\u00df\u6c34\U0001f34c"; // or u8"zß水🍌" std::cout << std::quoted(str) << " is " << strlen_mb(str) << " characters, but as much as " << 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
[bearbeiten] Siehe auch
| konvertiert das nächste Multibyte-Zeichen in ein Wide-Zeichen (Funktion) | |
| gibt die Anzahl der Bytes im nächsten Multibyte-Zeichen zurück, gegeben den Zustand (Funktion) | |
| C-Dokumentation für mblen
| |