Namespaces
Variants

std:: codecvt

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

class InternT,
class ExternT,
class StateT

> class codecvt ;

Modèle de classe std::codecvt encapsule la conversion des chaînes de caractères, y compris les caractères larges et multioctets, d'un encodage à un autre. Toutes les opérations d'E/S de fichiers effectuées via std:: basic_fstream < CharT > utilisent le facet std :: codecvt < CharT, char , std:: mbstate_t > de la locale associée au flux.

cpp/locale/codecvt base cpp/locale/locale/facet std-codecvt-inheritance.svg

Diagramme d'héritage

Table des matières

Spécialisations

La bibliothèque standard garantit la fourniture des spécialisations suivantes (elles sont requises pour être implémentées par tout objet locale ):

Défini dans l'en-tête <locale>
std :: codecvt < char , char , std:: mbstate_t > conversion identité
std :: codecvt < char16_t , char , std:: mbstate_t >
(depuis C++11) (obsolète en C++20)
conversion entre UTF-16 et UTF-8
std :: codecvt < char16_t , char8_t, std:: mbstate_t >
(depuis C++20) (obsolète)
conversion entre UTF-16 et UTF-8
std :: codecvt < char32_t , char , std:: mbstate_t >
(depuis C++11) (obsolète en C++20)
conversion entre UTF-32 et UTF-8
std :: codecvt < char32_t , char8_t, std:: mbstate_t >
(depuis C++20) (obsolète)
conversion entre UTF-32 et UTF-8
std :: codecvt < wchar_t , char , std:: mbstate_t > conversion entre les jeux de caractères larges natifs du système et les jeux de caractères étroits sur un octet

Types imbriqués

Type Définition
intern_type InternT
extern_type ExternT
state_type StateT

Membres de données

Membre Description
std::locale::id id [static] l'identifiant de la facette

Fonctions membres

construit un nouveau codecvt facet
(fonction membre publique)
invoque do_out
(fonction membre publique)
invoque do_in
(fonction membre publique)
invoque do_unshift
(fonction membre publique)
invoque do_encoding
(fonction membre publique)
invoque do_always_noconv
(fonction membre publique)
invoque do_length
(fonction membre publique)
invoque do_max_length
(fonction membre publique)

Fonctions membres protégées

détruit un facet codecvt
(fonction membre protégée)
[virtual]
convertit une chaîne de InternT vers ExternT , comme lors de l'écriture dans un fichier
(fonction membre virtuelle protégée)
[virtual]
convertit une chaîne de ExternT vers InternT , comme lors de la lecture depuis un fichier
(fonction membre virtuelle protégée)
[virtual]
génère la séquence de caractères de terminaison ExternT pour une conversion incomplète
(fonction membre virtuelle protégée)
[virtual]
retourne le nombre de caractères ExternT nécessaires pour produire un caractère InternT , si constant
(fonction membre virtuelle protégée)
teste si le facet encode une conversion d'identité pour toutes les valeurs d'argument valides
(fonction membre virtuelle protégée)
[virtual]
calcule la longueur de la chaîne ExternT qui serait consommée par la conversion dans le tampon InternT donné
(fonction membre virtuelle protégée)
[virtual]
retourne le nombre maximum de caractères ExternT qui pourraient être convertis en un seul caractère InternT
(fonction membre virtuelle protégée)

Hérité de std:: codecvt_base

Type imbriqué Définition
enum result { ok, partial, error, noconv } ; Type d'énumération non-scopée
Constante d'énumération Définition
ok la conversion s'est terminée sans erreur
partial tous les caractères source n'ont pas été convertis
error un caractère invalide a été rencontré
noconv aucune conversion nécessaire, les types d'entrée et de sortie sont identiques

Exemple

Les exemples suivants lisent un fichier UTF-8 en utilisant une locale qui implémente la conversion UTF-8 dans codecvt < wchar_t , char , std:: mbstate_t > et convertissent une chaîne UTF-8 en UTF-16 en utilisant l'une des spécialisations standard de std::codecvt .

#include <codecvt>
#include <cstdint>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <locale>
#include <string>
// utility wrapper to adapt locale-bound facets for wstring/wbuffer convert
template<class Facet>
struct deletable_facet : Facet
{
    template<class... Args>
    deletable_facet(Args&&... args) : Facet(std::forward<Args>(args)...) {}
    ~deletable_facet() {}
};
int main()
{
    // UTF-8 narrow multibyte encoding
    std::string data = reinterpret_cast<const char*>(+u8"z\u00df\u6c34\U0001f34c");
                       // or reinterpret_cast<const char*>(+u8"zß水🍌")
                       // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c"
    std::ofstream("text.txt") << data;
    // using system-supplied locale's codecvt facet
    std::wifstream fin("text.txt");
    // reading from wifstream will use codecvt<wchar_t, char, std::mbstate_t>
    // this locale's codecvt converts UTF-8 to UCS4 (on systems such as Linux)
    fin.imbue(std::locale("en_US.UTF-8"));
    std::cout << "The UTF-8 file contains the following UCS4 code units:\n" << std::hex;
    for (wchar_t c; fin >> c;)
        std::cout << "U+" << std::setw(4) << std::setfill('0')
                  << static_cast<uint32_t>(c) << ' ';
    // using standard (locale-independent) codecvt facet
    std::wstring_convert<
        deletable_facet<std::codecvt<char16_t, char, std::mbstate_t>>, char16_t> conv16;
    std::u16string str16 = conv16.from_bytes(data);
    std::cout << "\n\nThe UTF-8 file contains the following UTF-16 code units:\n"
              << std::hex;
    for (char16_t c : str16)
        std::cout << "U+" << std::setw(4) << std::setfill('0')
                  << static_cast<uint16_t>(c) << ' ';
    std::cout << '\n';
}

Sortie :

The UTF-8 file contains the following UCS4 code units:
U+007a U+00df U+6c34 U+1f34c 
The UTF-8 file contains the following UTF-16 code units:
U+007a U+00df U+6c34 U+d83c U+df4c

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 Applicable à Comportement publié Comportement corrigé
LWG 3767 C++20 std :: codecvt < char16_t , char8_t, std:: mbstate_t > et
std :: codecvt < char32_t , char8_t, std:: mbstate_t > sont indépendants des paramètres régionaux
les a dépréciés

Voir aussi

Conversions de caractères
Multioctets définis par les paramètres régionaux
(UTF-8, GB18030)
UTF-8
UTF-16
UTF-16 mbrtoc16 / c16rtomb (avec DR488 de C11)

codecvt < char16_t , char ,mbstate_t >
codecvt_utf8_utf16 < char16_t >
codecvt_utf8_utf16 < char32_t >
codecvt_utf8_utf16 < wchar_t >

N/A
UCS-2 c16rtomb (sans DR488 de C11) codecvt_utf8 < char16_t > codecvt_utf16 < char16_t >
UTF-32

mbrtoc32 / c32rtomb

codecvt < char32_t , char ,mbstate_t >
codecvt_utf8 < char32_t >

codecvt_utf16 < char32_t >

système wchar_t :

UTF-32 (non-Windows)
UCS-2 (Windows)

mbsrtowcs / wcsrtombs
use_facet < codecvt
< wchar_t , char ,mbstate_t >> ( locale )

codecvt_utf8 < wchar_t > codecvt_utf16 < wchar_t >
définit les erreurs de conversion de caractères
(classe)
représente le std::codecvt fourni par le système pour les locales nommées
(modèle de classe)
(C++11) (déprécié en C++17) (supprimé en C++26)
convertit entre UTF-8 et UCS-2/UCS-4
(modèle de classe)
(C++11) (déprécié en C++17) (supprimé en C++26)
convertit entre UTF-16 et UCS-2/UCS-4
(modèle de classe)
(C++11) (déprécié en C++17) (supprimé en C++26)
convertit entre UTF-8 et UTF-16
(modèle de classe)