Escape-Sequenzen
Escape-Sequenzen werden verwendet, um bestimmte Sonderzeichen in Zeichenkettenliteralen und Zeichenliteralen darzustellen.
Die folgenden Escape-Sequenzen sind verfügbar
| Escape Sequenz |
Beschreibung | Darstellung |
|---|---|---|
| Einfache Escape-Sequenzen | ||
\'
|
einfaches Anführungszeichen | Byte 0x27 in ASCII-Kodierung |
\"
|
doppeltes Anführungszeichen | Byte 0x22 in ASCII-Kodierung |
\?
|
Fragezeichen | Byte 0x3f in ASCII-Kodierung |
\\
|
Backslash | Byte 0x5c in ASCII-Kodierung |
\a
|
hörbarer Glockenton | Byte 0x07 in ASCII-Kodierung |
\b
|
Rücktaste | Byte 0x08 in ASCII-Kodierung |
\f
|
Seitenumbruch - neue Seite | Byte 0x0c in ASCII-Kodierung |
\n
|
Zeilenvorschub - neue Zeile | Byte 0x0a in ASCII-Kodierung |
\r
|
Wagenrücklauf | Byte 0x0d in ASCII-Kodierung |
\t
|
Horizontaler Tabulator | Byte 0x09 in ASCII-Kodierung |
\v
|
Vertikaler Tabulator | Byte 0x0b in ASCII-Kodierung |
| Numerische Escape-Sequenzen | ||
\nnn
|
beliebiger Oktalwert | Code-Einheit nnn (1~3 Oktalziffern) |
\o{n...} (seit C++23) |
Code-Einheit n... (beliebige Anzahl von Oktalziffern) | |
\xn...
|
beliebiger Hexadezimalwert | Code-Einheit n... (beliebige Anzahl von Hexadezimalziffern) |
\x{n...} (seit C++23) | ||
| Bedingte Escape-Sequenzen[1] | ||
\c
|
Implementierungsabhängig | Implementierungsabhängig |
| Universelle Zeichenbezeichner | ||
\unnnn
|
beliebiger Unicode-Wert; kann mehrere Code-Einheiten ergeben |
Codepunkt U+nnnn (4 Hexadezimalziffern) |
\u{n...} (seit C++23) |
Codepunkt U+n... (beliebige Anzahl von Hexadezimalziffern) | |
\Unnnnnnnn
|
Codepunkt U+nnnnnnnn (8 Hexadezimalziffern) | |
\N{NAME} (seit C++23) |
beliebiges Unicode-Zeichen | Zeichen, benannt durch NAME (siehe unten) |
- ↑ Bedingte Escape-Sequenzen werden bedingt unterstützt. Das Zeichen
cin jeder bedingten Escape-Sequenz ist ein Mitglied des Grundlegenden Quellzeichensets(bis C++23)Grundlegenden Zeichensatzes(seit C++23), das nicht das Zeichen ist, das dem\in einer anderen Escape-Sequenz folgt.
Inhalt |
[bearbeiten] Bereich von universellen Zeichenbezeichnern
|
Wenn ein universeller Zeichenbezeichner einem Codepunkt entspricht, der nicht 0x24 ( |
(bis C++11) |
|
Wenn ein universeller Zeichenbezeichner, der einem Codepunkt eines Mitglieds des Grundlegenden Quellzeichensets oder von Steuerzeichen entspricht, außerhalb eines Zeichen- oder Zeichenkettenliterals erscheint, ist das Programm schlecht geformt. Wenn ein universeller Zeichenbezeichner einem Surrogat-Codepunkt entspricht (der Bereich 0xD800-0xDFFF, einschließlich), ist das Programm schlecht geformt. Wenn ein universeller Zeichenbezeichner, der in einem UTF-16/32-Zeichenkettenliteral verwendet wird, keinem Codepunkt in ISO/IEC 10646 (der Bereich 0x0-0x10FFFF, einschließlich) entspricht, ist das Programm schlecht geformt. |
(seit C++11) (bis C++20) |
|
Wenn ein universeller Zeichenbezeichner, der einem Codepunkt eines Mitglieds des Grundlegenden Quellzeichensets oder von Steuerzeichen entspricht, außerhalb eines Zeichen- oder Zeichenkettenliterals erscheint, ist das Programm schlecht geformt. Wenn ein universeller Zeichenbezeichner keinem Codepunkt in ISO/IEC 10646 (der Bereich 0x0-0x10FFFF, einschließlich) entspricht oder einem Surrogat-Codepunkt entspricht (der Bereich 0xD800-0xDFFF, einschließlich), ist das Programm schlecht geformt. |
(seit C++20) (bis C++23) |
|
Wenn ein universeller Zeichenbezeichner, der einem Skalarwert eines Zeichens im Grundlegenden Zeichensatz oder einem Steuerzeichen entspricht, außerhalb eines Zeichen- oder Zeichenkettenliterals erscheint, ist das Programm schlecht geformt. Wenn ein universeller Zeichenbezeichner keinem Skalarwert eines Zeichens im Übersetzungszeichensatz entspricht, ist das Programm schlecht geformt. |
(seit C++23) |
Benannte universelle Zeichen-Escapes
Ein universeller Zeichenbezeichner der obigen Syntax ist ein benannter universeller Charakter. Er bezeichnet das entsprechende Zeichen im Unicode-Standard (Kapitel 4.8 Name), wenn die n-char-sequence seinem Zeichennamen oder einem seiner Zeichennamen-Aliase vom Typ „control“, „correction“ oder „alternate“ entspricht; andernfalls ist das Programm schlecht geformt. Diese Aliase sind in der Unicode Character Database unter NameAliases.txt aufgeführt. Keiner dieser Namen oder Aliase hat führende oder nachgestellte Leerzeichen. Eine gültige n-char-sequence darf nur Großbuchstaben A bis Z, Ziffern, Leerzeichen und den Bindestrich-Minus enthalten. Andere Zeichen kommen nie in einem Unicode-Zeichennamen vor, und ihr Erscheinen in einer n-char-sequence macht das Programm immer schlecht geformt. |
(seit C++23) | |||||||||||||||||||||||||||||
[bearbeiten] Anmerkungen
\0 ist die am häufigsten verwendete Oktal-Escape-Sequenz, da sie das abschließende Nullzeichen in Null-terminierten Zeichenketten darstellt.
Das Zeilenumbruchzeichen \n hat eine besondere Bedeutung bei der Verwendung in der Textmodus-Ein-/Ausgabe: es wird in die betriebssystemspezifische Zeilenumbruchdarstellung konvertiert, normalerweise ein Byte oder eine Byte-Sequenz. Einige Systeme kennzeichnen ihre Zeilen stattdessen mit Längenfeldern.
Oktal-Escape-Sequenzen haben eine Grenze von drei Oktalziffern, enden aber am ersten Zeichen, das keine gültige Oktalziffer ist, wenn es früher angetroffen wird.
Hexadezimal-Escape-Sequenzen haben keine Längenbegrenzung und enden am ersten Zeichen, das keine gültige Hexadezimalziffer ist. Wenn der Wert, der von einer einzelnen Hexadezimal-Escape-Sequenz dargestellt wird, nicht in den Wertebereich passt, der von dem in dieser Zeichenkette verwendeten Zeichentyp dargestellt wird (char, char8_t, (seit C++20)char16_t, char32_t, (seit C++11) oder wchar_t), ist das Ergebnis undefiniert.
|
Ein universeller Zeichenbezeichner in einem schmalen Zeichenkettenliteral oder einem 16-Bit-Zeichenkettenliteral kann auf mehr als eine Code-Einheit abgebildet werden, z. B. ist \U0001f34c in UTF-8 4 char-Code-Einheiten (\xF0\x9F\x8D\x8C) und in UTF-16 2 char16_t-Code-Einheiten (\xD83C\xDF4C). |
(seit C++11) |
Die Fragezeichen-Escape-Sequenz \? wird verwendet, um zu verhindern, dass Trigraph-Sequenzen innerhalb von Zeichenkettenliteralen interpretiert werden: eine Zeichenkette wie "??/" wird als "\" kompiliert, aber wenn das zweite Fragezeichen maskiert wird, wie in "?\?/", wird daraus "??/". Da Trigraph-Sequenzen aus C++ entfernt wurden, ist die Fragezeichen-Escape-Sequenz nicht mehr notwendig. Sie wird zur Kompatibilität mit C++14 (und früheren Revisionen) und C beibehalten.(seit C++17)
| Feature-Testmakro | Wert | Std | Feature |
|---|---|---|---|
__cpp_named_character_escapes |
202207L |
(C++23) | Benannte universelle Zeichen-Escapes |
[bearbeiten] Beispiel
Ausgabe
This is a test She said, "Sells she seashells on the seashore?"
[bearbeiten] Fehlerberichte
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 505 | C++98 | Das Verhalten war undefiniert, wenn das Zeichen nach einem Backslash nicht eines der in der Tabelle angegebenen war |
wurde bedingt unterstützt (semantisch implementierungsabhängig) |
[bearbeiten] Siehe auch
| C-Dokumentation für Escape-Sequenz
|