Namespaces
Variants

std:: mblen

From cppreference.net
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)