Namensräume
Varianten
Aktionen

std::text_encoding

Von cppreference.com
< cpp‎ | text
 
 
 
 
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:

  1. Primärname: Der offizielle Name, der im Register angegeben ist.
  2. Aliase: Eine implementierungsabhängige Obermenge von Aliassen aus dem Register.
  3. 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:

Inhalt

[edit] Member Types

repräsentiert den MIBenum-Wert der Zeichenkodierung
(public member enum)[edit]
ein view über Aliase der Zeichenkodierung
(public member class) [edit]

[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) [edit]
[static]
erzeugt ein neues text_encoding, das die gewöhnliche Zeichenliteral-Kodierung repräsentiert
(public static member function) [edit]
[static]
erzeugt ein neues text_encoding, das das implementierungsabhängige Zeichenkodierungsschema der Ausführungsumgebung repräsentiert
(public static member function) [edit]
Observer
gibt den MIBenum-Wert der aktuellen Zeichenkodierung zurück
(public member function) [edit]
gibt den Primärnamen der aktuellen Zeichenkodierung zurück
(public member function) [edit]
gibt einen view über Aliase der aktuellen Zeichenkodierung zurück
(public member function) [edit]
prüft das Zeichenkodierungsschema der Ausführungsumgebung mit dem angegebenen MIB-Wert
(public static member function) [edit]
Helfer
[static](private)
vergleicht zwei Aliasnamen unter Verwendung von Charset Alias Matching
(exposition-only static member function*)[edit]

[edit] Non-member functions

vergleicht zwei text_encoding-Objekte.
(public member function) [edit]

[edit] Helper classes

hash-Unterstützung für std::text_encoding
(Klassentemplate-Spezialisierung) [bearbeiten]

[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) [bearbeiten]