Namespaces
Variants

std:: codecvt

From cppreference.net
Definiert im Header <locale>
template <

class InternT,
class ExternT,
class StateT

> class codecvt ;

Klassentemplate std::codecvt kapselt die Konvertierung von Zeichenketten, einschließlich breiter und Multibyte-Zeichen, von einer Kodierung in eine andere. Alle Datei-I/O-Operationen, die durch std:: basic_fstream < CharT > durchgeführt werden, verwenden das std :: codecvt < CharT, char , std:: mbstate_t > Facet der im Stream hinterlegten Locale.

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

Vererbungsdiagramm

Inhaltsverzeichnis

Spezialisierungen

Die Standardbibliothek garantiert die Bereitstellung der folgenden Spezialisierungen (sie sind von jedem Locale-Objekt implementiert werden müssen ):

Definiert im Header <locale>
std :: codecvt < char , char , std:: mbstate_t > Identitätskonvertierung
std :: codecvt < char16_t , char , std:: mbstate_t >
(seit C++11) (veraltet in C++20)
Konvertierung zwischen UTF-16 und UTF-8
std :: codecvt < char16_t , char8_t, std:: mbstate_t >
(seit C++20) (veraltet)
Konvertierung zwischen UTF-16 und UTF-8
std :: codecvt < char32_t , char , std:: mbstate_t >
(seit C++11) (veraltet in C++20)
Konvertierung zwischen UTF-32 und UTF-8
std :: codecvt < char32_t , char8_t, std:: mbstate_t >
(seit C++20) (veraltet)
Konvertierung zwischen UTF-32 und UTF-8
std :: codecvt < wchar_t , char , std:: mbstate_t > Konvertierung zwischen den systemeigenen breiten und den Einzelbyte-Schmalzeichen-Zeichensätzen

Verschachtelte Typen

Typ Definition
intern_type InternT
extern_type ExternT
state_type StateT

Datenmitglieder

Mitglied Beschreibung
std::locale::id id [static] der Identifikator des Facet

Memberfunktionen

Konstruiert eine neue codecvt Facette
(öffentliche Elementfunktion)
ruft do_out auf
(öffentliche Elementfunktion)
ruft do_in auf
(öffentliche Elementfunktion)
ruft do_unshift auf
(öffentliche Elementfunktion)
ruft do_encoding auf
(öffentliche Elementfunktion)
ruft do_always_noconv auf
(öffentliche Elementfunktion)
ruft do_length auf
(öffentliche Elementfunktion)
ruft do_max_length auf
(öffentliche Elementfunktion)

Geschützte Memberfunktionen

zerstört eine codecvt Facette
(geschützte Elementfunktion)
[virtual]
konvertiert eine Zeichenkette von InternT zu ExternT , z.B. beim Schreiben in eine Datei
(virtuelle geschützte Elementfunktion)
[virtual]
konvertiert eine Zeichenkette von ExternT zu InternT , z.B. beim Lesen aus einer Datei
(virtuelle geschützte Elementfunktion)
[virtual]
erzeugt die Abschlusszeichenfolge von ExternT Zeichen für unvollständige Konvertierung
(virtuelle geschützte Elementfunktion)
[virtual]
gibt die Anzahl der ExternT Zeichen zurück, die notwendig sind, um ein InternT Zeichen zu erzeugen, falls konstant
(virtuelle geschützte Elementfunktion)
prüft, ob die Facette für alle gültigen Argumentwerte eine Identitätskonvertierung durchführt
(virtuelle geschützte Elementfunktion)
[virtual]
berechnet die Länge der ExternT Zeichenkette, die durch Konvertierung in den gegebenen InternT Puffer verbraucht würde
(virtuelle geschützte Elementfunktion)
[virtual]
gibt die maximale Anzahl von ExternT Zeichen zurück, die in ein einzelnes InternT Zeichen konvertiert werden könnten
(virtuelle geschützte Elementfunktion)

Geerbt von std:: codecvt_base

Geschachtelter Typ Definition
enum result { ok, partial, error, noconv } ; Unbegrenzter Aufzählungstyp
Aufzählungskonstante Definition
ok Konvertierung wurde ohne Fehler abgeschlossen
partial nicht alle Quellzeichen wurden konvertiert
error ungültiges Zeichen angetroffen
noconv keine Konvertierung erforderlich, Eingabe- und Ausgabetypen sind identisch

Beispiel

Die folgenden Beispiele lesen eine UTF-8-Datei unter Verwendung eines Locales, das UTF-8-Konvertierung in codecvt < wchar_t , char , std:: mbstate_t > implementiert und konvertieren eine UTF-8-Zeichenkette in UTF-16 unter Verwendung einer der standardmäßigen Spezialisierungen von 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';
}

Ausgabe:

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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3767 C++20 std :: codecvt < char16_t , char8_t, std:: mbstate_t > und
std :: codecvt < char32_t , char8_t, std:: mbstate_t > sind lokaleunabhängig
als veraltet markiert

Siehe auch

Zeichenkonvertierungen
Lokalitätsdefinierte Multibyte-Zeichen
(UTF-8, GB18030)
UTF-8
UTF-16
UTF-16 mbrtoc16 / c16rtomb (mit C11's DR488)

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

Nicht verfügbar
UCS-2 c16rtomb (ohne C11's DR488) 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 >

System wchar_t :

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

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

codecvt_utf8 < wchar_t > codecvt_utf16 < wchar_t >
definiert Zeichenkonvertierungsfehler
(Klasse)
repräsentiert die systemseitig bereitgestellte std::codecvt für die benannte Locale
(Klassentemplate)
(C++11) (veraltet in C++17) (entfernt in C++26)
konvertiert zwischen UTF-8 und UCS-2/UCS-4
(Klassentemplate)
(C++11) (veraltet in C++17) (entfernt in C++26)
konvertiert zwischen UTF-16 und UCS-2/UCS-4
(Klassentemplate)
(C++11) (veraltet in C++17) (entfernt in C++26)
konvertiert zwischen UTF-8 und UTF-16
(Klassentemplate)