Namensräume
Varianten
Aktionen

std::codecvt

Von cppreference.com
< cpp‎ | locale
 
 
 
 
 
Definiert in Header <locale>
template<

    class InternT,
    class ExternT,
    class StateT

> class codecvt;

Die Klasse std::codecvt kapselt die Konvertierung von Zeichenketten, einschließlich Weit- und Mehrbytezeichen, von einer Kodierung in eine andere. Alle über std::basic_fstream<CharT> durchgeführten Datei-I/O-Operationen verwenden die std::codecvt-Facet <CharT, char, std::mbstate_t> der im Stream eingebetteten Locale.

cpp/locale/codecvt basecpp/locale/locale/facetstd-codecvt-inheritance.svg

Vererbungdiagramm

Inhalt

[bearbeiten] Spezialisierungen

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

Definiert in 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 nativen Weitzeichen und den einbyteigen schmalen Zeichensätzen des Systems

[bearbeiten] Verschachtelte Typen

Typ Definition
intern_type InternT
extern_type ExternT
state_type StateT

[edit] Datenmember

Mitglied Beschreibung
std::locale::id id [static] die Kennung des Facets

[bearbeiten] Memberfunktionen

erstellt ein neues codecvt-Facet
(öffentliche Memberfunktion)
ruft do_out auf
(public member function) [bearbeiten]
ruft do_in auf
(public member function) [bearbeiten]
ruft do_unshift auf
(public member function) [bearbeiten]
ruft do_encoding auf
(public member function) [bearbeiten]
ruft do_always_noconv auf
(public member function) [bearbeiten]
ruft do_length auf
(public member function) [bearbeiten]
ruft do_max_length auf
(public member function) [bearbeiten]

[bearbeiten] Geschützte Memberfunktionen

zerstört ein codecvt-Facet
(geschützte Memberfunktion)
[virtuell]
konvertiert eine Zeichenkette von InternT nach ExternT, z. B. beim Schreiben in eine Datei
(virtual protected member function) [bearbeiten]
[virtuell]
konvertiert eine Zeichenkette von ExternT nach InternT, z. B. beim Lesen aus einer Datei
(virtual protected member function) [bearbeiten]
[virtuell]
erzeugt die Abschlusszeichenfolge von ExternT-Zeichen für eine unvollständige Konvertierung
(virtual protected member function) [bearbeiten]
[virtuell]
gibt die Anzahl der ExternT-Zeichen zurück, die zur Erzeugung eines InternT-Zeichens erforderlich sind, falls diese konstant ist
(virtual protected member function) [bearbeiten]
prüft, ob das Facet eine Identitätskonvertierung für alle gültigen Argumentwerte kodiert
(virtual protected member function) [bearbeiten]
[virtuell]
berechnet die Länge der ExternT-Zeichenkette, die bei der Konvertierung in den gegebenen InternT-Puffer verbraucht würde
(virtual protected member function) [bearbeiten]
[virtuell]
gibt die maximale Anzahl von ExternT-Zeichen zurück, die in ein einzelnes InternT-Zeichen konvertiert werden könnten
(virtual protected member function) [bearbeiten]

Geerbt von std::codecvt_base

Verschachtelter Typ Definition
enum result { ok, partial, error, noconv }; Aufzählungstyp ohne Gültigkeitsbereich
Enumerationskonstante Definition
ok Die Konvertierung wurde ohne Fehler abgeschlossen.
partiell Nicht alle Quellzeichen wurden konvertiert.
error Ungültiges Zeichen angetroffen.
noconv Keine Konvertierung erforderlich, Eingabe- und Ausgabetypen sind identisch.

[bearbeiten] Beispiel

Das folgende Beispiel liest eine UTF-8-Datei mithilfe einer Locale, die die UTF-8-Konvertierung in codecvt<wchar_t, char, std::mbstate_t> implementiert, und konvertiert eine UTF-8-Zeichenkette mithilfe einer der Standard-Spezialisierungen von std::codecvt in UTF-16.

#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

[bearbeiten] 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 Locale-unabhängig
wurden von ihnen veraltet erklärt

[bearbeiten] Siehe auch

Zeichen
Konvertierungen
lokal definierte Multibyte-Zeichen
(UTF-8, GB18030)
UTF-8
UTF-16
UTF-16 mbrtoc16 / c16rtomb (mit C11 DR488)

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 (ohne C11 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 (non-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) [bearbeiten]
repräsentiert die vom System bereitgestellte std::codecvt für die benannte Locale
(Klassentemplate) [bearbeiten]
(C++11)(deprecated in C++17)(removed in C++26)
konvertiert zwischen UTF-8 und UCS-2/UCS-4
(Klassentemplate) [bearbeiten]
(C++11)(deprecated in C++17)(removed in C++26)
konvertiert zwischen UTF-16 und UCS-2/UCS-4
(Klassentemplate) [bearbeiten]
(C++11)(deprecated in C++17)(removed in C++26)
konvertiert zwischen UTF-8 und UTF-16
(Klassentemplate) [bearbeiten]