W3docs

Sonderzeichen und Escape-Sequenzen in Java

Java Escape-Sequenzen wie \n, \t, \\, \" und Unicode-Escapes in String-Literalen verwenden.

Einige Zeichen lassen sich nicht direkt in einem String-Literal schreiben — ein " würde den String beenden, ein direkter Zeilenumbruch würde die Quellzeile unterbrechen, und ein Backslash hat bereits eine besondere Aufgabe: Er signalisiert dem Compiler, das Folgende als Escape zu behandeln. Java löst dieses Problem mit Escape-Sequenzen: kurze, mit einem Backslash beginnende Codes, die für diese schwierigen Zeichen stehen. Ein separater Mechanismus, Unicode-Escapes (\uXXXX), ermöglicht es, jeden Code-Punkt der Basic Multilingual Plane über seinen Hexadezimalwert anzugeben.

Diese Seite behandelt die Standard-Escape-Sequenzen, Escapes innerhalb von char-Literalen, Unicode- und Oktal-Escapes, wie Text-Blöcke die Regeln lockern, und die häufigsten Fehler, über die man stolpert.

Die Standard-Escape-Sequenzen

SequenzBedeutung
\nZeilenumbruch (LF, U+000A)
\rWagenrücklauf (CR, U+000D)
\tTabulator (U+0009)
\bRücktaste (U+0008)
\fSeitenvorschub (U+000C)
\"Anführungszeichen
\'Apostroph
\\ein einzelner Backslash
\0Null-Zeichen (U+0000)
\sLeerzeichen (U+0020), hinzugefügt in Java 15

Beispiele:

String multi = "Line 1\nLine 2\nLine 3";
String quoted = "She said \"hi\"";
String tabbed = "name\tage\tcity";
String path = "C:\\Users\\Ada\\code.java";

Beim Ausgeben dieser Strings werden die Escape-Sequenzen zu den eigentlichen Zeichen:

Line 1
Line 2
Line 3
She said "hi"
name    age    city
C:\Users\Ada\code.java

Innerhalb eines char-Literals

Ein char-Literal wird in einfache Anführungszeichen eingeschlossen. Dieselben Escape-Sequenzen gelten, aber die Regeln für Anführungszeichen kehren sich um: Innerhalb einfacher Anführungszeichen muss \' escaped werden, während " direkt geschrieben werden kann. (Innerhalb eines doppelt angeführten Strings ist es umgekehrt — \" wird escaped und ' steht direkt.)

char quote = '\'';   // a single-quote character
char tab   = '\t';   // a tab
char back  = '\\';   // one backslash
char dquote = '"';   // no escape needed here

Unicode-Escapes

Um ein beliebiges Zeichen der Basic Multilingual Plane einzubetten, verwendet man \uXXXX, wobei XXXX der vierstellige hexadezimale Code-Punkt ist:

String greeting = "Café";       // "Café"
String pi = "π ≈ 3.14";   // "π ≈ 3.14"
char heart = '♥';               // '♥'

Code-Punkte außerhalb der BMP (die meisten Emoji) benötigen ein Surrogatpaar — zwei \uXXXX-Escapes — daher ist es fast immer einfacher, das Zeichen direkt einzufügen.

Hinweis
Unicode-Escapes unterscheiden sich von allen anderen Escape-Sequenzen: Der Compiler übersetzt \uXXXX in einem allerersten Durchlauf, bevor der Quellcode überhaupt in Tokens aufgeteilt wird. Deshalb ist ein versehentliches (Zeilenumbruch) innerhalb eines Strings ein Kompilierfehler statt eines Laufzeit-Zeilenumbruchs, und warum \uXXXX überall gültig ist — in Kommentaren, Bezeichnern, sogar zwischen Operatoren. Gewöhnliche Escapes wie \n und \t werden erst später, innerhalb von String- und char-Literalen, interpretiert.

Oktal-Escapes

\ gefolgt von 1–3 Oktalziffern (0–7) ergibt das Zeichen mit diesem Oktalwert:

char c = '\101';   // 'A' (decimal 65)
char d = '\14';    // form feed

Diese sieht man selten — Unicode-Escapes sind klarer.

Text-Blöcke umgehen die meisten Escapes

In einem Text-Block (Java 15+) können Zeilenumbrüche und nicht escapte doppelte Anführungszeichen direkt geschrieben werden — ideal zum Einbetten von JSON, SQL oder HTML. Die einzigen Sequenzen, die noch benötigt werden, sind \\ für einen direkten Backslash und \uXXXX für Unicode:

String json = """
        {
          "name": "Ada",
          "tagline": "She invented programming"
        }
        """;

Zu beachten: Die Schlüssel "name" und "tagline" benötigen kein \" — sie stehen innerhalb eines """..."""-Blocks.

Eine Demonstration

java— editable, runs on the server

Häufige Fehler

  • "\n" schreiben und Windows-Zeilenenden erwarten. \n ist nur LF. Für plattformkorrekte Zeilenumbrüche in formatierter Ausgabe verwendet man %n innerhalb von printf / format — es wird zum Zeilentrenner des Systems erweitert.
  • Vergessen, Backslashes in Regex zu escapen. Ein Regex-Muster lebt zunächst in einem Java-String, durchläuft also zwei Escape-Ebenen. Um eine Ziffer (\d) zu matchen, schreibt man den String "\\d" — der Compiler macht aus \\ einen Backslash, und die Regex-Engine liest dann \d. Um einen direkten Backslash zu matchen, benötigt man vier: "\\\\".
  • verwenden, um einen Zeilenumbruch einzubetten. ist der Zeilenumbruch-Code-Punkt, und weil Unicode-Escapes vor dem Tokenizer übersetzt werden, fügt der Compiler mitten in das String-Literal einen echten Zeilenumbruch ein — was ein Syntaxfehler ist. Man verwendet \n für Zeilenumbrüche innerhalb von Strings; \uXXXX behält man für druckbare Zeichen vor.
  • Ein unvollständiges oder ungültiges Unicode-Escape. Auf \u müssen genau vier Hexadezimalziffern folgen. "\u12" oder "\uZZZZ" ist ein Kompilierfehler, kein direkter Backslash. Wenn man ein direktes \u haben möchte, muss der Backslash escaped werden: "\\u".

Was kommt als Nächstes

Java-Zahlen bietet einen gezielten Blick auf die numerischen Typen, ihre Literale und ihre Präzision.

Practice

Übung
Welche Escape-Sequenz steht für einen einzelnen Backslash in einem String-Literal?
Welche Escape-Sequenz steht für einen einzelnen Backslash in einem String-Literal?
Was this page helpful?