Namespaces
Variants

std:: text_encoding

From cppreference.net
Definiert im Header <text_encoding>
struct text_encoding ;
(seit C++26)

Die Klasse text_encoding bietet einen Mechanismus zur Identifizierung von Zeichenkodierungen. Sie wird verwendet, um die gewöhnliche Zeichenliteral-Kodierung der Übersetzungsumgebung zur Kompilierzeit und die Zeichenkodierung der Ausführungsumgebung zur Laufzeit zu bestimmen.

Jedes text_encoding -Objekt kapselt ein Zeichenkodierungsschema , das eindeutig durch einen Enumerator in text_encoding::id und einen entsprechenden Namen, dargestellt durch einen nullterminierten Byte-String, identifiziert wird. Diese können über die mib() - bzw. name() -Memberfunktionen abgerufen werden. Die Bestimmung, ob ein Objekt ein Zeichenkodierungsschema repräsentiert, das in der Übersetzungs- oder Ausführungsumgebung implementiert ist, ist implementierungsdefiniert.

Die Klasse text_encoding ist ein TriviallyCopyable -Typ. Das Array-Objekt, das den entsprechenden Namen des Zeichenkodierungsschemas repräsentiert, ist innerhalb des text_encoding -Objekts selbst verschachtelt . Der gespeicherte Name ist auf maximal max_name_length Zeichen exklusive des Nullzeichens ' \0 ' begrenzt.

Die Klasse unterstützt sowohl registrierte als auch nicht-registrierte Zeichenkodierungen. Registrierte Kodierungen sind jene, die im IANA Character Sets Registry zu finden sind, mit Ausnahme der folgenden Zeichenkodierungen:

  • NATS-DANO (33)
  • NATS-DANO-ADD (34).

Darüber hinaus bietet die Klasse Zugriff auf registrierte Zeichenkodierungen für:

  1. Primary name : Der offizielle Name, der im Registry angegeben ist.
  2. Aliases : Eine implementierungsdefinierte Obermenge von Aliasnamen aus dem Registry.
  3. MIBenum value : Ein eindeutiger Identifikator 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, erhält die folgenden Invarianten aufrecht:

  • * e. name ( ) ! = ' \0 ' ist true , und
  • e. mib ( ) == std:: text_encoding ( e. name ( ) ) . mib ( ) ist true .

Inhaltsverzeichnis

Mitgliedertypen

repräsentiert den MIBenum-Wert der Zeichenkodierung
(öffentliches Mitglieds-Enum)
eine view über Aliase der Zeichenkodierung
(öffentliche Mitgliedsklasse)

Memberkonstante

Name Wert
constexpr std:: size_t max_name_length
[static]
63
(öffentliche statische Member-Konstante)

Datenmitglieder

Mitglied Beschreibung
std :: text_encoding :: id mib_ (privat) ein MIBenum-Wert mit id :: unknown als Standardwert
( Nur zur Darstellung verwendetes Mitgliedsobjekt* )
char [ max_name_length + 1 ] name_ (privat) ein gespeicherter Primärname
( Nur zur Darstellung verwendetes Mitgliedsobjekt* )

Memberfunktionen

Erstellung
konstruiert neues text_encoding Objekt
(öffentliche Elementfunktion)
[static]
konstruiert ein neues text_encoding das die gewöhnliche Zeichenliteral-Kodierung repräsentiert
(öffentliche statische Elementfunktion)
[static]
konstruiert ein neues text_encoding das die implementierungsdefinierte Zeichenkodierungsschemata der Ausführungsumgebung repräsentiert
(öffentliche statische Elementfunktion)
Beobachter
gibt den MIBenum-Wert der aktuellen Zeichenkodierung zurück
(öffentliche Elementfunktion)
gibt den primären Namen der aktuellen Zeichenkodierung zurück
(öffentliche Elementfunktion)
gibt eine view über Aliase der aktuellen Zeichenkodierung zurück
(öffentliche Elementfunktion)
prüft das Zeichenkodierungsschema der Ausführungsumgebung mit dem angegebenen MIB-Wert
(öffentliche statische Elementfunktion)
Hilfsfunktionen
[static] (private)
vergleicht zwei Aliasnamen unter Verwendung von Charset Alias Matching
( nur zur Darstellung verwendete statische Elementfunktion* )

Nicht-Member-Funktionen

vergleicht zwei text_encoding Objekte.
(öffentliche Elementfunktion)

Hilfsklassen

Hash-Unterstützung für std::text_encoding
(Klassen-Template-Spezialisierung)

Hinweise

Bei der Arbeit mit Zeichenkodierungen ist es wichtig zu beachten, dass die primären Namen oder Aliase von zwei verschiedenen registrierten Zeichenkodierungen nicht äquivalent sind, wenn sie unter Verwendung von Charset Alias Matching verglichen werden, wie im Unicode Technical Standard beschrieben.

Der Einfachheit halber werden die Enumeratoren von text_encoding::id als Mitglieder von text_encoding eingeführt und können direkt zugegriffen 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. Zusätzlich sollte der primäre Name einer registrierten Kodierung nicht verwendet werden, um eine ähnliche, aber unterschiedliche 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

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

Siehe auch

Menge polymorpher Facetten, die kulturelle Unterschiede kapseln
(Klasse)