Namespaces
Variants

std:: mbrtoc32

From cppreference.net
Défini dans l'en-tête <cuchar>
std:: size_t mbrtoc32 ( char32_t * pc32,

const char * s,
std:: size_t n,

std:: mbstate_t * ps ) ;
(depuis C++11)

Convertit un caractère multioctet étroit en sa représentation de caractère UTF-32.

Si s n'est pas un pointeur nul, inspecte au plus n octets de la chaîne de caractères multioctets, en commençant par l'octet pointé par s pour déterminer le nombre d'octets nécessaires pour compléter le prochain caractère multioctet (incluant toute séquence de changement). Si la fonction détermine que le prochain caractère multioctet dans s est complet et valide, le convertit en caractère 32 bits correspondant et le stocke dans * pc32 (si pc32 n'est pas nul).

Si le caractère multioctet dans * s correspond à une séquence multi-char32_t (impossible avec UTF-32), alors après le premier appel à cette fonction, * ps est mis à jour de telle sorte que les appels suivants à mbrtoc32 écriront les char32_t supplémentaires, sans considérer * s .

Si s est un pointeur nul, les valeurs de n et pc32 sont ignorées et l'appel est équivalent à std :: mbrtoc32 ( nullptr, "" , 1 , ps ) .

Si le caractère large produit est le caractère nul, l'état de conversion * ps représente l'état de décalage initial.

L'encodage multioctet utilisé par cette fonction est spécifié par la locale C actuellement active.

Table des matières

Paramètres

pc32 - pointeur vers l'emplacement où le caractère 32 bits résultant sera écrit
s - pointeur vers la chaîne de caractères multioctets utilisée comme entrée
n - limite du nombre d'octets dans s pouvant être examinés
ps - pointeur vers l'objet d'état de conversion utilisé lors de l'interprétation de la chaîne multioctets

Valeur de retour

Le premier des éléments suivants qui s'applique :

  • 0 si le caractère converti à partir de s (et stocké dans * pc32 s'il n'est pas nul) était le caractère nul.
  • le nombre d'octets [ 1 ... n ] du caractère multi-octets converti avec succès à partir de s .
  • - 3 si le prochain char32_t d'un caractère multi- char32_t a maintenant été écrit dans * pc32 . Aucun octet n'est traité en entrée dans ce cas.
  • - 2 si les prochains n octets constituent un caractère multi-octets incomplet mais valide jusqu'à présent. Rien n'est écrit dans * pc32 .
  • - 1 si une erreur d'encodage se produit. Rien n'est écrit dans * pc32 , la valeur EILSEQ est stockée dans errno et la valeur de * ps n'est pas spécifiée.

Exemples

#include <cassert>
#include <clocale>
#include <cstring>
#include <cuchar>
#include <cwchar>
#include <iomanip>
#include <iostream>
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    std::string str = "z\u00df\u6c34\U0001F34C"; // ou u8"zß水🍌"
    std::cout << "Traitement de " << str.size() << " octets : [ " << std::showbase;
    for (unsigned char c : str)
        std::cout << std::hex << +c << ' ';
    std::cout << "]\n";
    std::mbstate_t state{}; // initialisé à zéro pour l'état initial
    char32_t c32;
    const char* ptr = str.c_str(), *end = str.c_str() + str.size() + 1;
    while (std::size_t rc = std::mbrtoc32(&c32, ptr, end - ptr, &state))
    {
        std::cout << "Caractère UTF-32 suivant : " << std::hex
                  << static_cast<int>(c32) << " obtenu à partir de ";
        assert(rc != (std::size_t) - 3); // pas de substituts en UTF-32
        if (rc == (std::size_t) - 1)
            break;
        if (rc == (std::size_t) - 2)
            break;
        std::cout << std::dec << rc << " octets [ ";
        for (std::size_t n = 0; n < rc; ++n)
            std::cout << std::hex << +static_cast<unsigned char>(ptr[n]) << ' ';
        std::cout << "]\n";
        ptr += rc;
    }
}

Sortie :

Traitement de 10 octets : [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c ]
Caractère UTF-32 suivant : 0x7a obtenu à partir de 1 octets [ 0x7a ]
Caractère UTF-32 suivant : 0xdf obtenu à partir de 2 octets [ 0xc3 0x9f ]
Caractère UTF-32 suivant : 0x6c34 obtenu à partir de 3 octets [ 0xe6 0xb0 0xb4 ]
Caractère UTF-32 suivant : 0x1f34c obtenu à partir de 4 octets [ 0xf0 0x9f 0x8d 0x8c ]

Voir aussi

(C++11)
convertit un caractère UTF-32 en encodage multioctet étroit
(fonction)
[virtual]
convertit une chaîne de ExternT vers InternT , comme lors de la lecture depuis un fichier
(fonction membre protégée virtuelle de std::codecvt<InternT,ExternT,StateT> )
Documentation C pour mbrtoc32