std::codecvt
| Definiert in Header <locale> |
||
| template< class InternT, |
||
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.
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) | |
ruft do_in auf(public member function) | |
ruft do_unshift auf(public member function) | |
ruft do_encoding auf(public member function) | |
ruft do_always_noconv auf(public member function) | |
ruft do_length auf(public member function) | |
ruft do_max_length auf(public member function) |
[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) |
| [virtuell] |
konvertiert eine Zeichenkette von ExternT nach InternT, z. B. beim Lesen aus einer Datei(virtual protected member function) |
| [virtuell] |
erzeugt die Abschlusszeichenfolge von ExternT-Zeichen für eine unvollständige Konvertierung(virtual protected member function) |
| [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) |
| [virtuell] |
prüft, ob das Facet eine Identitätskonvertierung für alle gültigen Argumentwerte kodiert (virtual protected member function) |
| [virtuell] |
berechnet die Länge der ExternT-Zeichenkette, die bei der Konvertierung in den gegebenen InternT-Puffer verbraucht würde(virtual protected member function) |
| [virtuell] |
gibt die maximale Anzahl von ExternT-Zeichen zurück, die in ein einzelnes InternT-Zeichen konvertiert werden könnten(virtual protected member function) |
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> |
N/A |
| UCS-2 | c16rtomb (ohne C11 DR488) | codecvt_utf8<char16_t> | codecvt_utf16<char16_t> |
| UTF-32 |
codecvt<char32_t,char,mbstate_t> |
codecvt_utf16<char32_t> | |
| System wchar_t UTF-32 (non-Windows) |
mbsrtowcs / wcsrtombs |
codecvt_utf8<wchar_t> | codecvt_utf16<wchar_t> |
| definiert Zeichenkonvertierungsfehler (Klasse) | |
| repräsentiert die vom System bereitgestellte std::codecvt für die benannte Locale (Klassentemplate) | |
| (C++11)(deprecated in C++17)(removed in C++26) |
konvertiert zwischen UTF-8 und UCS-2/UCS-4 (Klassentemplate) |
| (C++11)(deprecated in C++17)(removed in C++26) |
konvertiert zwischen UTF-16 und UCS-2/UCS-4 (Klassentemplate) |
| (C++11)(deprecated in C++17)(removed in C++26) |
konvertiert zwischen UTF-8 und UTF-16 (Klassentemplate) |