Namespaces
Variants

std::codecvt<InternT,ExternT,StateT>:: out, do_out

From cppreference.net
Défini dans l'en-tête <locale>
public :

result out ( StateT & state,
const InternT * from,
const InternT * from_end,
const InternT * & from_next,
ExternT * to,
ExternT * to_end,

ExternT * & to_next ) const ;
(1)
protected :

virtual result do_out ( StateT & state,
const InternT * from,
const InternT * from_end,
const InternT * & from_next,
ExternT * to,
ExternT * to_end,

ExternT * & to_next ) const ;
(2)
1) Fonction membre publique, appelle la fonction membre do_out de la classe la plus dérivée.
2) Si cette facette codecvt définit une conversion, traduit les caractères internes de la plage source [ from , from_end ) en caractères externes, plaçant les résultats dans les emplacements suivants commençant à to . Convertit au plus from_end - from caractères internes et écrit au plus to_end - to caractères externes. Laisse from_next et to_next pointant juste après le dernier élément converti avec succès.

Si cette facette codecvt ne définit pas de conversion, aucun caractère n'est converti. to_next est défini comme étant égal à to , state reste inchangé, et std::codecvt_base::noconv est retourné.

do_out ( state, from, from + 1 , from_next, to, to_end, to_next ) doit retourner ok si

  • cette facette codecvt est utilisée par basic_filebuf , et
  • do_out ( state, from, from_end, from_next, to, to_end, to_next ) retournerait ok lorsque from ! = from_end .

Table des matières

Valeur de retour

Une valeur de type std::codecvt_base::result , indiquant le statut de réussite comme suit :

ok conversion terminée
partial espace insuffisant dans le tampon de sortie ou fin inattendue du tampon source
error caractère rencontré ne pouvant être converti
noconv cette facette est non-convertissante, aucune sortie écrite

La spécialisation non-convertissante std:: codecvt < char , char , std:: mbstate_t > retourne toujours std::codecvt_base::noconv .

Notes

Requiert que from <= from_end && to <= to_end et que state représente soit l'état de décalage initial, soit soit obtenu en convertissant les caractères précédents dans la séquence.

Bien que codecvt prenne en charge les conversions N:M (par exemple UTF-16 vers UTF-8, où deux caractères internes peuvent être nécessaires pour décider quels caractères externes produire), std::basic_filebuf ne peut utiliser que les facettes codecvt qui définissent une conversion 1:N, c'est-à-dire qu'il doit être capable de traiter un caractère interne à la fois lors de l'écriture dans un fichier.

Lors de conversions N:M, cette fonction peut renvoyer std::codecvt_base::partial après avoir consommé tous les caractères source ( from_next == from_end ). Cela signifie qu'un autre caractère interne est nécessaire pour compléter la conversion (par exemple lors de la conversion UTF-16 vers UTF-8, si le dernier caractère dans le tampon source est une unité de code haute).

L'effet sur state est délibérément non spécifié. Dans les facettes standards, il est utilisé pour maintenir l'état de décalage comme lors de l'appel à std:: wcsrtombs , et est donc mis à jour pour refléter l'état de décalage après le dernier caractère converti avec succès, mais une facette définie par l'utilisateur est libre de l'utiliser pour maintenir tout autre état, par exemple compter le nombre de caractères spéciaux rencontrés.

Exemple

#include <iostream>
#include <locale>
#include <string>
int main()
{
    std::locale::global(std::locale("en_US.utf8"));
    auto& f = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(std::locale());
    std::wstring internal = L"z\u00df\u6c34\U0001f34c"; // L"zß水🍌"
    // note that the following can be done with wstring_convert
    std::mbstate_t mb{}; // état de décalage initial
    std::string external(internal.size() * f.max_length(), '\0'); 
    const wchar_t* from_next;
    char* to_next;
    f.out(mb, &internal[0], &internal[internal.size()], from_next,
              &external[0], &external[external.size()], to_next);
    // vérification d'erreur omise pour la brièveté
    external.resize(to_next - &external[0]);
    std::cout << "The string in narrow multibyte encoding: " << external << '\n';
}

Sortie :

The string in narrow multibyte encoding: zß水🍌

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement tel que publié Comportement correct
LWG 76 C++98 il n'était pas clair si la conversion est requise
pour supporter la prise d'un caractère interne à la fois
requis uniquement si utilisé
par basic_filebuf

Voir aussi

[virtual]
écrit des caractères dans le fichier associé depuis la zone de mise en mémoire tampon
(fonction membre protégée virtuelle de std::basic_filebuf<CharT,Traits> )
convertit une chaîne large en chaîne d'octets
(fonction membre publique de std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc> )
convertit une chaîne large en chaîne de caractères multioctets étroite, avec état donné
(fonction)
[virtual]
convertit une chaîne de ExternT vers InternT , comme lors de la lecture depuis un fichier
(fonction membre protégée virtuelle)