Namespaces
Variants

std:: mbrlen

From cppreference.net
Défini dans l'en-tête <cwchar>
std:: size_t mbrlen ( const char * s, std:: size_t n, std:: mbstate_t * ps ) ;

Détermine la taille, en octets, du reste du caractère multioctet dont le premier octet est pointé par s , compte tenu de l'état de conversion actuel ps .

Cette fonction est équivalente à l'appel std:: mbrtowc ( nullptr, s, n, ps ? ps : & internal ) pour un objet caché internal de type std::mbstate_t , sauf que l'expression ps n'est évaluée qu'une seule fois.

Table des matières

Paramètres

s - pointeur vers un élément d'une chaîne de caractères multioctets
n - limite du nombre d'octets dans s pouvant être examinés
ps - pointeur vers la variable contenant l'état de conversion

Valeur de retour

  • 0 si les n octets suivants ou moins complètent le caractère nul.
  • Le nombre d'octets (entre 1 et n ) qui complètent un caractère multioctet valide.
  • std:: size_t ( - 1 ) si une erreur d'encodage se produit.
  • std:: size_t ( - 2 ) si les n octets suivants font partie d'un caractère multioctet potentiellement valide, qui reste incomplet après l'examen de tous les n octets.

Exemple

#include <clocale>
#include <cwchar>
#include <iostream>
#include <string>
int main()
{
    // permet à mbrlen() de fonctionner avec l'encodage multioctet UTF-8
    std::setlocale(LC_ALL, "en_US.utf8");
    // encodage multioctet étroit UTF-8
    std::string str = "水"; // or u8"\u6c34" or "\xe6\xb0\xb4"
    std::mbstate_t mb = std::mbstate_t();
    // utilisation simple : longueur d'un caractère multioctet complet
    const std::size_t len = std::mbrlen(&str[0], str.size(), &mb);
    std::cout << "La longueur de " << str << " est " << len << " octets\n";
    // utilisation avancée : reprise au milieu d'un caractère multioctet
    const std::size_t len1 = std::mbrlen(&str[0], 1, &mb);
    if (len1 == std::size_t(-2))
        std::cout << "Le premier octet de " << str
                  << " est un caractère multioctet incomplet (mbrlen retourne -2)\n";
    const std::size_t len2 = std::mbrlen(&str[1], str.size() - 1, &mb);
    std::cout << "Les " << str.size() - 1 << " octets restants de " << str
              << " contiennent " << len2 << " octets du caractère multioctet\n";
    // cas d'erreur :
    std::cout << "Tenter d'appeler mbrlen() au milieu de " << str
              << " en état de décalage initial retourne "
              << (int)mbrlen(&str[1], str.size(), &mb) << '\n';
}

Sortie :

La longueur de 水 est 3 octets.
Le premier octet de 水 est un caractère multioctet incomplet (mbrlen retourne -2)
Les 2 octets restants de 水 contiennent 2 octets du caractère multioctet
Tenter d'appeler mbrlen() au milieu de 水 en état de décalage initial retourne -1

Voir aussi

convertit le caractère multioctet suivant en caractère large, en fonction de l'état
(fonction)
retourne le nombre d'octets dans le prochain caractère multioctet
(fonction)
[virtual]
calcule la longueur de la chaîne ExternT qui serait consommée par la conversion dans le tampon InternT donné
(fonction membre protégée virtuelle de std::codecvt<InternT,ExternT,StateT> )
Documentation C pour mbrlen