Zeichensätze und Kodierungen
Diese Seite beschreibt mehrere Zeichensätze, die im C++-Standard spezifiziert sind.
ÜbersetzungszeichensatzDer Übersetzungszeichensatz besteht aus den folgenden Elementen
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
|
| 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
|
| 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
|
(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
|