Namespaces
Variants

std:: c16rtomb

From cppreference.net
Défini dans l'en-tête <cuchar>
std:: size_t c16rtomb ( char * s, char16_t c16, std:: mbstate_t * ps ) ;
(depuis C++11)

Convertit un point de code unique d'une représentation de caractère 16 bits à longueur variable (typiquement, UTF-16) vers une représentation de caractère multioctet étroit.

Si s n'est pas un pointeur nul et c16 est la dernière unité de code 16 bits dans un codage de longueur variable valide d'un point de code, la fonction détermine le nombre d'octets nécessaires pour stocker la représentation du caractère multi-octets de ce point de code (en incluant toute séquence de changement, et en prenant en compte l'état actuel de conversion multi-octets * ps ), et stocke la représentation du caractère multi-octets dans le tableau de caractères dont le premier élément est pointé par s , mettant à jour * ps si nécessaire. Au maximum MB_CUR_MAX octets peuvent être écrits par cette fonction.

Si s est un pointeur nul, l'appel est équivalent à std :: c16rtomb ( buf, u ' \0 ' , ps ) pour un tampon interne buf .

Si c16 n'est pas l'unité de code finale dans une représentation 16 bits d'un caractère étendu, il n'écrit pas dans le tableau pointé par s , seulement * ps est mis à jour.

Si c16 est le caractère large nul u ' \0 ' , un octet nul est stocké, précédé par toute séquence de changement nécessaire pour restaurer l'état de changement initial et le paramètre d'état de conversion * ps est mis à jour pour représenter l'état de changement initial.

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

Table des matières

Paramètres

s - pointeur vers le tableau de caractères étroits où le caractère multi-octets sera stocké
c16 - le caractère 16 bits à convertir
ps - pointeur vers l'objet d'état de conversion utilisé lors de l'interprétation de la chaîne multi-octets

Valeur de retour

En cas de succès, retourne le nombre d'octets (y compris toute séquence de décalage) écrits dans le tableau de caractères dont le premier élément est pointé par s . Cette valeur peut être 0 , par exemple lors du traitement du premier char16_t d'une paire de substitution.

En cas d'échec (si c16 n'est pas un caractère 16-bit valide), retourne - 1 , stocke EILSEQ dans errno , et laisse * ps dans un état non spécifié.

Notes

La norme C++ renvoie à la norme C pour la sémantique de cette fonction. Dans C11 tel que publié, contrairement à std::mbrtoc16 qui convertit le multioctet à largeur variable (comme UTF-8) en encodage 16 bits à largeur variable (comme UTF-16), cette fonction ne peut convertir que l'encodage 16 bits à unité unique, ce qui signifie qu'elle ne peut pas convertir UTF-16 en UTF-8 malgré l'intention initiale de cette fonction. Ce problème a été corrigé par le rapport de défaut post-C11 DR488 .

Exemple

L'exemple suppose que la correction pour le rapport de défaut 488 est appliquée.

#include <climits>
#include <clocale>
#include <cuchar>
#include <iomanip>
#include <iostream>
#include <string_view>
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    std::u16string_view strv = u"zß水🍌"; // or z\u00df\u6c34\U0001F34C
    std::cout << "Processing " << strv.size() << " UTF-16 code units: [ ";
    for (char16_t c : strv)
        std::cout << std::showbase << std::hex << static_cast<int>(c) << ' ';
    std::cout << "]\n";
    std::mbstate_t state{};
    char out[MB_LEN_MAX]{};
    for (char16_t c : strv)
    {
        std::size_t rc = std::c16rtomb(out, c, &state);
        std::cout << static_cast<int>(c) << " converted to [ ";
        if (rc != (std::size_t) - 1)
            for (unsigned char c8 : std::string_view{out, rc})
                std::cout << +c8 << ' ';
        std::cout << "]\n";
    }
}

Sortie :

Processing 5 UTF-16 code units: [ 0x7a 0xdf 0x6c34 0xd83c 0xdf4c ]
0x7a converted to [ 0x7a ]
0xdf converted to [ 0xc3 0x9f ]
0x6c34 converted to [ 0xe6 0xb0 0xb4 ]
0xd83c converted to [ ]
0xdf4c converted to [ 0xf0 0x9f 0x8d 0x8c ]

Voir aussi

(C++11)
convertit un caractère multioctet étroit en encodage UTF-16
(fonction)
(C++20)
convertit une chaîne UTF-8 en encodage multioctet étroit
(fonction)
[virtual]
convertit une chaîne de InternT vers ExternT , comme lors de l'écriture dans un fichier
(fonction membre protégée virtuelle de std::codecvt<InternT,ExternT,StateT> )
Documentation C pour c16rtomb