std:: mblen
|
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) |
|
|
C-Dokumentation
für
mblen
|
|