std:: mblen
|
Défini dans l'en-tête
<cstdlib>
|
||
|
int
mblen
(
const
char
*
s,
std::
size_t
n
)
;
|
||
Détermine la taille, en octets, du caractère multioctet dont le premier octet est pointé par s .
Si s est un pointeur nul, réinitialise l'état de conversion global et détermine si les séquences de décalage sont utilisées.
Cette fonction est équivalente à l'appel std:: mbtowc ( nullptr, s, n ) , sauf que l'état de conversion de std::mbtowc n'est pas affecté.
Table des matières |
Notes
Chaque appel à
mblen
met à jour l'état de conversion global interne (un objet statique de type
std::mbstate_t
, uniquement connu de cette fonction). Si l'encodage multioctet utilise des états de changement, il faut veiller à éviter les retours en arrière ou les analyses multiples. Dans tous les cas, plusieurs threads ne devraient pas appeler
mblen
sans synchronisation :
std::mbrlen
peut être utilisé à la place.
Paramètres
| s | - | pointeur vers le caractère multi-octets |
| n | - | limite du nombre d'octets dans s pouvant être examinés |
Valeur de retour
Si s n'est pas un pointeur nul, retourne le nombre d'octets contenus dans le caractère multioctet ou - 1 si les premiers octets pointés par s ne forment pas un caractère multioctet valide ou 0 si s pointe vers le caractère nul ' \0 ' .
Si s est un pointeur nul, réinitialise son état de conversion interne pour représenter l'état de décalage initial et retourne 0 si l'encodage multioctet actuel n'est pas dépendant de l'état (n'utilise pas de séquences de décalage) ou une valeur non nulle si l'encodage multioctet actuel est dépendant de l'état (utilise des séquences de décalage).
Exemple
#include <clocale> #include <cstdlib> #include <iomanip> #include <iostream> #include <stdexcept> #include <string_view> // le nombre de caractères dans une chaîne multioctet est la somme des mblen() // note : l'approche plus simple est std::mbstowcs(nullptr, s.c_str(), s.size()) std::size_t strlen_mb(const std::string_view s) { std::mblen(nullptr, 0); // réinitialiser l'état de conversion 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() { // permettre à mblen() de travailler avec l'encodage multioctet UTF-8 std::setlocale(LC_ALL, "en_US.utf8"); // encodage multioctet étroit UTF-8 const std::string_view str = "z\u00df\u6c34\U0001f34c"; // ou u8"zß水🍌" std::cout << std::quoted(str) << " est " << strlen_mb(str) << " caractères, mais jusqu'à " << str.size() << " octets : "; dump_bytes(str); }
Sortie possible :
"zß水🍌" is 4 characters, but as much as 10 bytes: 7A C3 9F E6 B0 B4 F0 9F 8D 8C
Voir aussi
|
convertit le prochain caractère multioctet en caractère large
(fonction) |
|
|
retourne le nombre d'octets dans le prochain caractère multioctet, avec état donné
(fonction) |
|
|
Documentation C
pour
mblen
|
|