Namensräume
Varianten
Aktionen

Zeichensätze und Kodierungen

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

Diese Seite beschreibt mehrere Zeichensätze, die im C++-Standard spezifiziert sind.

Inhalt

Übersetzungszeichensatz

Der Übersetzungszeichensatz besteht aus den folgenden Elementen

  • jedem abstrakten Zeichen, dem ein Codepunkt im Unicode-Coderaum zugewiesen ist, und
  • jedem eindeutigen Zeichen für jeden Unicode-Skalarwert, der keinem abstrakten Zeichen zugewiesen ist.

Der Übersetzungszeichensatz ist eine Obermenge des Basiszeichensatzes und des Basis-Literal-Zeichensatzes (siehe unten).

(seit C++23)

[bearbeiten] Basiszeichensatz

Der Basiszeichensatz besteht aus den folgenden 96(bis C++26)99(seit C++26) Zeichen

Code-Einheit Zeichen Glyphe
U+0009 Horizontale Tabulierung
U+000B Vertikale Tabulierung
U+000C Seitenvorschub (FF)
U+0020 Leerzeichen
U+000A Zeilenvorschub (LF) new-line
U+0021 Ausrufezeichen !
U+0022 Anführungszeichen "
U+0023 Raute #
U+0025 Prozentzeichen %
U+0026 Und-Zeichen &
U+0027 Apostroph '
U+0028 Linke Klammer (
U+0029 Rechte Klammer )
U+002A Sternchen *
U+002B Pluszeichen +
U+002C Komma ,
U+002D Minuszeichen -
U+002E Punkt .
U+002F Schrägstrich /
U+0030 .. U+0039 Ziffer Null .. Neun 0 1 2 3 4 5 6 7 8 9
U+003A Doppelpunkt :
U+003B Semikolon ;
U+003C Kleiner-als-Zeichen <
U+003D Gleichheitszeichen =
U+003E Größer-als-Zeichen >
U+003F Fragezeichen ?
U+0041 .. U+005A Lateinischer Großbuchstabe A .. Z A B C D E F G H I J K L M

N O P Q R S T U V W X Y Z

U+005B Linke eckige Klammer [
U+005C Umgekehrter Schrägstrich \
U+005D Rechte eckige Klammer ]
U+005E Zirkumflex ^
U+005F Unterstrich _
U+0061 .. U+007A Lateinischer Kleinbuchstabe a .. z a b c d e f g h i j k l m

n o p q r s t u v w x y z

U+007B Linke geschweifte Klammer {
U+007C Vertikaler Strich |
U+007D Rechte geschweifte Klammer }
U+007E Tilde ~

Die folgenden Zeichen werden seit C++26 dem Basiszeichensatz hinzugefügt

Code-Einheit Zeichen Glyphe
U+0024 Dollarzeichen $
U+0040 Kaufmännisches Und-Zeichen (At-Zeichen) @
U+0060 Gravis-Akzent `
(seit C++26)

[bearbeiten] Basis-Literal-Zeichensatz

Der Basis-Literal-Zeichensatz besteht aus allen Zeichen des Basiszeichensatzes plus den folgenden Steuerzeichen

Code-Einheit Zeichen
U+0000 Null
U+0007 Glocke
U+0008 Rücktaste
U+000D Wagenrücklauf (CR)

[bearbeiten] Ausführungszeichensatz

Der Ausführungszeichensatz und der Ausführungs-Breitzeichenzeichensatz sind Obermengen des Basis-Literal-Zeichensatzes. Die Kodierungen der Ausführungszeichensätze und die Mengen zusätzlicher Elemente (falls vorhanden) sind gebietsspezifisch (locale-specific). Jedes Element des Ausführungs-Breitzeichenzeichensatzes muss als eine eindeutige wchar_t-Code-Einheit darstellbar sein.

[bearbeiten] Codierung von Code-Einheiten und Literalen

Eine Code-Einheit ist ein Ganzzahlwert vom Zeichentypt. Zeichen in einem Zeichenliteral, das kein Mehrzeichen- oder nicht kodierbares Zeichenliteral ist, oder in einem Stringliteral werden als eine Sequenz von einer oder mehreren Code-Einheiten kodiert, wie durch das Kodierungspräfix bestimmt; dies wird als die jeweilige Literal-Kodierung bezeichnet.

Eine Literal-Kodierung oder eine gebietsspezifische Kodierung eines der Ausführungszeichensätze kodiert jedes Element des Basis-Literal-Zeichensatzes als eine einzelne Code-Einheit mit einem nicht-negativen Wert, die sich von der Code-Einheit für jedes andere solche Element unterscheidet. Ein Zeichen, das nicht im Basis-Literal-Zeichensatz enthalten ist, kann mit mehr als einer Code-Einheit kodiert werden; der Wert einer solchen Code-Einheit kann derselbe sein wie der einer Code-Einheit für ein Element des Basis-Literal-Zeichensatzes. Die Kodierungen der Ausführungszeichensätze können keine Beziehung zu einer Literal-Kodierung haben.

Die gewöhnliche Literal-Kodierung ist die Kodierung, die auf ein gewöhnliches Zeichen oder Stringliteral angewendet wird. Die Wide-Literal-Kodierung ist die Kodierung, die auf ein Wide-Zeichen oder Wide-Stringliteral angewendet wird.

Das U+0000 NULL-Zeichen wird mit dem Wert 0 kodiert. Kein anderes Element des Übersetzungszeichensatzes wird mit einer Code-Einheit mit dem Wert 0 kodiert. Der Code-Einheitenwert jedes Dezimalziffernzeichens nach der Ziffer 0 (U+0030) muss um eins größer sein als der Wert des vorherigen. Die gewöhnlichen und Wide-Literal-Kodierungen sind ansonsten implementierungsdefiniert.

Für ein UTF-8-, UTF-16- oder UTF-32-Literal wird der UCS-Skalarwert, der jedem Zeichen des Übersetzungszeichensatzes entspricht, wie in ISO/IEC 10646 für die jeweilige UCS-Kodierungsform spezifiziert, kodiert.

[bearbeiten] Notizen

Die Standardnamen einiger Zeichensätze wurden in C++23 durch P2314R4 geändert.

Neue(r) Name(n) Alter(e) Name(n)
Basiszeichensatz Basis-Quelltext-Zeichensatz
Basis-Literal-Zeichensatz Basis-Ausführungszeichensatz
Basis-Ausführungs-Breitzeichenzeichensatz

Die Zuordnung von Zeichen aus der Quelldatei (außer einer UTF-8-Quelldatei)(seit C++23) zu dem Basiszeichensatz(bis C++23)dem Übersetzungszeichensatz(seit C++23) während der Übersetzungsphase 1 ist implementierungsdefiniert, sodass eine Implementierung dokumentieren muss, wie die Basis-Quelltextzeichen in Quelldateien dargestellt werden.

[bearbeiten] Defect reports

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
CWG 788 C++98 die Werte der Elemente der Ausführungszeichensätze
waren implementierungsdefiniert, aber nicht gebietsspezifisch
sie sind gebietsspezifisch
CWG 1796 C++98 die Darstellung des Null-(Breit-)Zeichens im
Basis-Ausführungs-(Breit-)Zeichensatz hatte nur Nullenbits
nur der Wert Null war vorgeschrieben

[bearbeiten] Siehe auch

ASCII-Tabelle
C-Dokumentation für Zeichensätze und Kodierungen