Namespaces
Variants

Character sets and encodings

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

Inhaltsverzeichnis

Übersetzungszeichensatz

Der Übersetzungszeichensatz besteht aus folgenden Elementen:

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

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

(seit C++23)

Basis-Zeichensatz

Der grundlegende Zeichensatz besteht aus den folgenden 96 (bis C++26) 99 (seit C++26) Zeichen:

Codepoint Zeichen Glyphe
U+0009 Tabulator
U+000B Zeilentabulator
U+000C Seitenvorschub (FF)
U+0020 Leerzeichen
U+000A Zeilenvorschub (LF) neue Zeile
U+0021 Ausrufezeichen !
U+0022 Anführungszeichen "
U+0023 Doppelkreuz #
U+0025 Prozentzeichen %
U+0026 Kaufmanns-Und &
U+0027 Apostroph '
U+0028 Linke Klammer (
U+0029 Rechte Klammer )
U+002A Sternchen *
U+002B Pluszeichen +
U+002C Komma ,
U+002D Bindestrich-Minus -
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 Backslash \
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 Senkrechter Strich |
U+007D Rechte geschweifte Klammer }
U+007E Tilde ~

Die folgenden Zeichen wurden seit C++26 zum Basiszeichensatz hinzugefügt:

Codepunkt Zeichen Glyphe
U+0024 Dollarzeichen $
U+0040 Klammeraffe @
U+0060 Gravis `
(seit C++26)

Basis-Zeichensatz für Literale

Der grundlegende Literal-Zeichensatz besteht aus allen Zeichen des Basis-Zeichensatzes, plus den folgenden Steuerzeichen:

Codepoint Zeichen
U+0000 Null
U+0007 Bell
U+0008 Backspace
U+000D Wagenrücklauf (CR)

Ausführungszeichensatz

Der Ausführungszeichensatz und der Ausführungs-Breitzeichensatz sind Obermengen des grundlegenden Literalzeichensatzes. Die Kodierungen der Ausführungszeichensätze und die Mengen zusätzlicher Elemente (falls vorhanden) sind gebietsschemaspezifisch. Jedes Element des Ausführungs-Breitzeichensatzes muss als eineindeutige wchar_t Codeeinheit darstellbar sein.

Codeeinheit und Literal-Codierung

Eine Codeeinheit ist ein ganzzahliger Wert des Zeichentyps. Zeichen in einem Character-Literal außer einem Multicharacter- oder nicht kodierbaren Character-Literal oder in einem String-Literal werden als Sequenz von einer oder mehreren Codeeinheiten kodiert, wie durch das Encoding-Präfix bestimmt; dies wird als das jeweilige Literal-Encoding bezeichnet.

Eine Literalkodierung oder eine gebietsschemaspezifische Kodierung eines der Ausführungszeichensätze kodiert jedes Element des grundlegenden Literalzeichensatzes als einzelne Codeeinheit mit nicht-negativem Wert, verschieden von der Codeeinheit für jedes andere solche Element. Ein Zeichen, das nicht im grundlegenden Literalzeichensatz enthalten ist, kann mit mehr als einer Codeeinheit kodiert werden; der Wert einer solchen Codeeinheit kann derselbe sein wie der einer Codeeinheit für ein Element des grundlegenden Literalzeichensatzes. Die Kodierungen der Ausführungszeichensätze können unabhängig von jeder Literalkodierung sein.

Die gewöhnliche Literalkodierung ist die Kodierung, die auf ein gewöhnliches Zeichen- oder Zeichenkettenliteral angewendet wird. Die breite Literalkodierung ist die Kodierung, die auf ein breites Zeichen- oder Zeichenkettenliteral angewendet wird.

Das U+0000 NULL-Zeichen wird als Wert 0 codiert. Kein anderes Element des Übersetzungszeichensatzes wird mit einer Codeeinheit des Werts 0 codiert. Der Codeeinheitenwert jedes Dezimalziffernzeichens nach der Ziffer 0 (U+0030) soll um eins größer sein als der Wert des vorherigen. Die gewöhnlichen und breiten Literalcodierungen 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.

Hinweise

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

Neue Bezeichnung(en) Alte Bezeichnung(en)
basic character set basic source character set
basic literal character set basic execution character set
basic execution wide-character set

Abbildung von Quelltextdatei (außer einer UTF-8-Quelltextdatei) (seit C++23) Zeichen auf den Basiszeichensatz (bis C++23) Übersetzungszeichensatz (seit C++23) während Übersetzungsphase 1 ist implementierungsdefiniert, daher ist eine Implementierung verpflichtet zu dokumentieren, wie die Basisquellzeichen in Quelltextdateien dargestellt werden.

Fehlerberichte

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

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
CWG 788 C++98 die Werte der Member der Ausführungs-Zeichensätze
waren implementierungsdefiniert, aber nicht lokalspezifisch
sie sind lokalspezifisch
CWG 1796 C++98 die Darstellung des Null-(Breit-)Zeichens im
grundlegenden Ausführungs-(Breit-)Zeichensatz hatte alle Bits null
nur Wert muss null sein

Siehe auch

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