std::text_encoding
| Definiert in Header <text_encoding> |
||
| struct text_encoding; |
(seit C++26) | |
Die Klasse text_encoding stellt einen Mechanismus zur Identifizierung von Zeichenkodierungen bereit. Sie wird verwendet, um zur Kompilierzeit die gewöhnliche Zeichenliteral-Kodierung der Übersetzungsumgebung und zur Laufzeit die Zeichenkodierung der Ausführungsumgebung zu bestimmen.
Jedes text_encoding-Objekt kapselt ein Zeichenkodierungsschema, das eindeutig durch einen Enumerator in text_encoding::id und einen entsprechenden Namen, dargestellt durch eine nullterminierte Byte-Zeichenkette, identifiziert wird. Diese können über die Member-Funktionen mib() bzw. name() abgerufen werden. Die Bestimmung, ob ein Objekt ein Zeichenkodierungsschema repräsentiert, das in der Übersetzungs- oder Ausführungsumgebung implementiert ist, ist implementierungsabhängig.
Die Klasse text_encoding ist ein TriviallyCopyable-Typ. Das Array-Objekt, das den entsprechenden Namen des Zeichenkodierungsschemas repräsentiert, ist in dem text_encoding-Objekt selbst verschachtelt. Der gespeicherte Name ist auf maximal max_name_length Zeichen begrenzt, ohne das Nullzeichen '\0'.
Die Klasse unterstützt sowohl registrierte als auch nicht registrierte Zeichenkodierungen. Registrierte Kodierungen sind diejenigen, die im IANA Character Sets Registry zu finden sind, mit Ausnahme der folgenden Zeichenkodierungen:
- NATS-DANO (33)
- NATS-DANO-ADD (34).
Zusätzlich bietet die Klasse für registrierte Zeichenkodierungen Zugriff auf:
- Primärname: Der offizielle Name, der im Register angegeben ist.
- Aliase: Eine implementierungsabhängige Obermenge von Aliassen aus dem Register.
- MIBenum-Wert: Ein eindeutiger Bezeichner zur Identifizierung von codierten Zeichensätzen.
Nicht registrierte Kodierungen können mit einem Enumerator id::other oder id::unknown und einem benutzerdefinierten Namen dargestellt werden.
Ein text_encoding-Objekt e, dessen MIBenum-Wert weder id::other noch id::unknown ist, hält die folgenden Invarianten:
- *e.name() != '\0' ist true, und
- e.mib() == std::text_encoding(e.name()).mib() ist true.
Inhalt |
[edit] Member Types
| repräsentiert den MIBenum-Wert der Zeichenkodierung (public member enum) | |
ein view über Aliase der Zeichenkodierung(public member class) |
[edit] Member constant
| Name | Wert |
| constexpr std::size_t max_name_length [static] |
63 (öffentliche statische Member-Konstante) |
[edit] Data members
| Mitglied | Beschreibung |
std::text_encoding::id mib_ (private) |
ein MIBenum-Wert mit id::unknown als Standardwert ((exposition-only member object*) |
char[max_name_length + 1] name_ (private) |
ein gespeicherter Primärname ((exposition-only member object*) |
[edit] Member functions
Erzeugung | |
erzeugt ein neues text_encoding-Objekt(public member function) | |
| [static] |
erzeugt ein neues text_encoding, das die gewöhnliche Zeichenliteral-Kodierung repräsentiert(public static member function) |
| [static] |
erzeugt ein neues text_encoding, das das implementierungsabhängige Zeichenkodierungsschema der Ausführungsumgebung repräsentiert(public static member function) |
Observer | |
| gibt den MIBenum-Wert der aktuellen Zeichenkodierung zurück (public member function) | |
| gibt den Primärnamen der aktuellen Zeichenkodierung zurück (public member function) | |
gibt einen view über Aliase der aktuellen Zeichenkodierung zurück(public member function) | |
| [static] |
prüft das Zeichenkodierungsschema der Ausführungsumgebung mit dem angegebenen MIB-Wert (public static member function) |
Helfer | |
| [static](private) |
vergleicht zwei Aliasnamen unter Verwendung von Charset Alias Matching (exposition-only static member function*) |
[edit] Non-member functions
vergleicht zwei text_encoding-Objekte.(public member function) |
[edit] Helper classes
| hash-Unterstützung für std::text_encoding (Klassentemplate-Spezialisierung) |
[edit] Anmerkungen
Bei der Arbeit mit Zeichenkodierungen ist es wichtig zu beachten, dass die Primärnamen oder Aliase von zwei unterschiedlichen registrierten Zeichenkodierungen bei einem Vergleich mit Charset Alias Matching, wie vom Unicode Technical Standard beschrieben, nicht äquivalent sind.
Zur Vereinfachung werden die Enumeratoren von text_encoding::id als Member von text_encoding eingeführt und können direkt abgerufen werden. Das bedeutet, dass text_encoding::ASCII und text_encoding::id::ASCII auf dieselbe Entität verweisen.
Es wird empfohlen, dass die Implementierung registrierte Kodierungen als nicht austauschbar behandelt. Außerdem sollte der Primärname einer registrierten Kodierung nicht verwendet werden, um eine ähnliche, aber andere nicht registrierte Kodierung zu beschreiben, es sei denn, es gibt einen klaren Präzedenzfall dafür.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_text_encoding |
202306L |
(C++26) | std::text_encoding
|
[edit] Beispiel
#include <locale> #include <print> #include <text_encoding> int main() { // literal encoding is known at compile-time constexpr std::text_encoding literal_encoding = std::text_encoding::literal(); // check for literal encoding static_assert(literal_encoding.mib() != std::text_encoding::other && literal_encoding.mib() != std::text_encoding::unknown); // environment encoding is only known at runtime std::text_encoding env_encoding = std::text_encoding::environment(); // associated encoding of the default locale std::text_encoding locale_encoding = std::locale("").encoding(); std::println("The literal encoding is {}", literal_encoding.name()); std::println("The aliases of literal encoding:"); for (const char* alias_name : literal_encoding.aliases()) std::println(" -> {}", alias_name); if (env_encoding == locale_encoding) std::println("Both environment and locale encodings are the same"); std::println("The environment encoding is {}", env_encoding.name()); std::println("The aliases of environment encoding:"); for (const char* alias_name : env_encoding.aliases()) std::println(" -> {}", alias_name); }
Mögliche Ausgabe
The literal encoding is UTF-8 The aliases of literal encoding: -> UTF-8 -> csUTF8 Both environment and locale encodings are the same The environment encoding is ANSI_X3.4-1968 The aliases of environment encoding: -> US-ASCII -> iso-ir-6 -> ANSI_X3.4-1968 -> ANSI_X3.4-1986 -> ISO_646.irv:1991 -> ISO646-US -> us -> IBM367 -> cp367 -> csASCII -> ASCII
[edit] Siehe auch
| Satz von polymorphen Facetten, die kulturelle Unterschiede kapseln (Klasse) |