Escape-Sequenz
Eine Escape-Sequenz (nach dem Escape-Zeichen, englisch to escape ‚entkommen‘) ist eine Zeichenkombination in der technischen Informatik, die keinen Text repräsentiert, sondern vom Gerät abgefangen wird und eine Sonderfunktion ausführt. Bei einem Bildschirmterminal kann dies z. B. die Cursor-Positionierung sein, bei einem Drucker die Umschaltung auf eine andere Schriftgröße oder das Auswerfen der Seite.
Als englisch Escaping wird auch die Nutzung eines Maskierungszeichens bezeichnet, das ebenfalls eine Escape-Sequenz darstellt. Umgekehrt wird hier ein Zeichen, das normalerweise als Teil einer Sonderfunktion erkannt würde, ohne Funktion interpretiert.
Funktionsweise
Der Name leitet sich von dem Zeichen ab, mit dem die Sequenz meistens eingeleitet wird; dem ESC-Zeichen (im ASCII-Zeichensatz Hexadezimal-Code 1B, dezimal 27), welches spätestens seit 1968 als Umschaltzeichen zwischen normaler Bedeutung der Zeichen und Sonderfunktion benutzt wurde.[1]
Das jeweilige Programm – unabhängig davon, ob es sich um eine Anwendung für Desktoprechner oder ein Steuerprogramm in einem Peripheriegerät handelt – erkennt beim Verarbeiten einer Zeichenfolge, zum Beispiel eines Textes, das Escape-Zeichen, steigt aus der normalen Verarbeitung aus und löst die der folgenden Zeichensequenz zugeordnete Sonderfunktion aus. Anschließend wird die normale Verarbeitung fortgesetzt. Während der Bearbeitung des Textes dagegen, zum Beispiel in einem Texteditor, bleibt ein Escape-Zeichen als gewöhnliches Zeichen uninterpretiert und löst damit keine Funktion aus. Ein Sonderfall sind WYSIWYG-Programme, zu denen beispielsweise moderne Textverarbeitungsprogramme zählen, bei denen die Anzeige direkt der Ausgabe mit allen Sonderfunktionen entspricht.
Um beim Programmieren nicht-druckbare Steuerzeichen im Quelltext darzustellen, wird bestimmten Folgen von druckbaren Zeichen die Bedeutung einer Sonderfunktion verliehen, indem ein (anderes) bestimmtes Zeichen vorangestellt wird, das als Maskierungszeichen dient. So steht in der Programmiersprache C innerhalb einer Zeichenkettenkonstanten beispielsweise ein \n
für einen Zeilenumbruch, ein \t
für ein Horizontal-Tabulatorzeichen und ein \"
für ein Anführungszeichen (während das einfache "
nicht Teil einer Zeichenketten-Konstanten ist, sondern deren Ende bezeichnet). Eine solche Zeichenfolge wird in Übertragung der alten Funktionsbezeichnung ebenfalls Escape-Sequenz genannt, obwohl das eigentliche ESC-Zeichen dabei keine Verwendung mehr findet. In ähnlicher Weise wird von Microsoft Word in der Bearbeitungsfunktion „Suchen und Ersetzen“ das Zeichen ^
verwendet, beispielsweise ^t
für das Horizontal-Tabulatorzeichen.
Verwendung zur Druckersteuerung
Nach wie vor werden Escape-Sequenzen bei der Ansteuerung von Druckern verwendet. Beispiele für weit verbreitete Escape-Sequenz-basierte Druckersprachen sind:
- ESC/P (Epson)
- PCL (Hewlett-Packard)
Manche Drucker arbeiten dagegen nicht mit Escape-Sequenzen, sondern beispielsweise mit Seitenbeschreibungssprachen wie PostScript oder empfangen Befehle über eine separate Steueradresse auf dem Bus (z. B. bei Commodore-Rechnern).
Beispiel: In der Drucksteuersprache PCL5 von Hewlett-Packard wird der Cursor mittels der Sequenz ESC & a Spaltennummer C
horizontal in einer bestimmten Textspalte positioniert.[2]
Verwendung zur Terminalsteuerung
Im Terminalbereich sind die ANSI-Escapesequenzen in einem Format weit verbreitet, das auf Standards basiert, die ursprünglich als ANSI X3.41-1974 und X3.64-1977 bzw. ECMA-48 (1976)[3] veröffentlicht wurden. Die Sequenzen bestehen dabei aus dem Steuerzeichen Escape und einer Folge von druckbaren Zeichen. ECMA-48 erhielt 1991 seine fünfte und letzte Erweiterung[4] und wurde auch als ISO/IEC 6429 standardisiert.
Die VT100 Terminals des Herstellers DEC waren 1978 unter den ersten, deren Funktion auf diesem Standard beruhte.[5] Durch die Popularität des VT100 Terminals, wurden Terminalsysteme mit Escape-Sequenzen auf Basis des ECMA-48 Standards weit verbreitet.[6]
Dieser Standard wurde so populär, dass Konsolentreiber wie ANSI.SYS für MS-DOS (bzw. allgemein PC-kompatibles DOS), OS/2 und auch die Shell des AmigaOS den Standard implementierten. Dadurch, dass das bei Unix-artigen Betriebssysteme verbreitete Terminalemulationsprogramm xterm auf VT100 (und somit auf dem ANSI-Standard) basiert[7], arbeiten heute die virtuellen Konsolen und Terminal-Fenster der meisten Unix-artigen Betriebssysteme (wie beispielsweise macOS und Linux) mit Escape-Sequenzen in diesem Format. Erwähnenswert ist auch, dass so gut wie alle der genannten Konsolen und Terminals in ihrer Implementierung inzwischen weit über den ursprünglichen ECMA-48 Standard hinausgehen und viele der Erweiterungen aus den späteren DEC Terminals unterstützen, wie z. B. dem VT420-Terminal.[7] Auch die Eingabeaufforderung von Windows 10 unterstützt Escape-Sequenzen ab Version 1511 im erweiterten Umfang von xterm.[8]
Allerdings gab und gibt es für die Terminal-Steuerung auch andere, proprietäre auf Escape-Sequenzen basierende Formate, die jedoch nicht standardisiert wurden. Zum Beispiel unterscheidet sich Format der Wyse oder Televideo Terminals wesentlich vom ANSI-Standard. Diese Sequenzen bestehen aus meist zur zwei Zeichen, wobei bei längeren Sequenzen dasjenige Zeichen, das direkt auf das Escape-Zeichen folgt, die Funktion der Sequenz festlegt. Im Unterschied dazu ist es beim ANSI-Standard so, dass typischerweise erst das letzte Zeichen der Sequenz entscheidet, welche Funktion die Sequenz hat.[9][5][10] Beispielsweise wird im ANSI-Standard der Cursor in eine bestimmte Position gestellt, indem der Server die Escape-Sequenz ESC [ zeile ; spalte H
sendet.[11] Beim Wyse Terminal geschieht dies mit ESC a zeile R spalte C
.[12] In diesen Beispielen sind jeweils die Zeichen H
und a
funktionsentscheidend.
Beispiele
Die folgende Tabelle enthält eine Gegenüberstellung einiger Sequenzen zur Terminalsteuerung in verschiedenen Formaten.[5][10][9]
Funktion | ANSI/VT100 | Wyse |
---|---|---|
Bildschirm Löschen | ESC [ 2 J |
ESC T |
Zeile ab Cursor löschen | ESC [ K |
ESC t |
Cursor positionieren | ESC [ zeile ; spalte H z. B. ESC [ 5 ; 1 H |
ESC a zeile R spalte C z. B. ESC a 005 R 001 C |
Nachfolgenden Text blinkend darstellen | ESC [ 5 m |
ESC G 2 |
Cursor um (Pn) Zeilen aufwärts, | ESC [ Pn A z. B. ESC [ 5 A |
(keine Entsprechung) |
In C und verwandten Programmiersprachen
In C und zu C verwandten Programmiersprachen wie C++, C#, Java, awk, Perl und JavaScript können in Zeichenfolgen durch folgende Escape-Sequenzen häufig benötigte Steuerzeichen eingefügt werden (wobei nicht alle dieser Sprachen alle hier aufgeführten Sequenzen unterstützen). In C selbst sind Escape-Sequenzen, auf Deutsch auch Flucht-Sequenzen, ein Teil des Ausführungszeichensatzes der Programmiersprache. Diese sind auch gemäß ANSI C standardisiert, obwohl manche Compiler (auf bestimmten Betriebssystemen) zusätzlich auch vom Standard abweichende Escape-Sequenzen verwenden können. Die Bezeichnungen vieler Steuerzeichen stammen noch aus der Zeit, als Ausgaben vorwiegend auf Fernschreibern und Druckern erfolgten.
In C und damit verwandten Programmiersprachen wird eine Escape-Sequenz mit dem Backslash, Taste: \, eingeleitet.
\a |
akustisches Signal (von englisch alert) |
\b |
Rückschritt (von englisch backspace) |
\e od.\E |
ANSI Escape, hexadezimal 0x1B
Ein Escapezeichen für eine höhere Interpretationsebene, siehe oben. Nicht Bestandteil von ISO C und ISO C++! |
\f |
Seitenvorschub (von englisch form feed) |
\n |
Zeilenvorschub (von englisch new line) |
\r |
Wagenrücklauf (von englisch carriage return) |
\t |
Horizontal-Tabulatorzeichen (von englisch horizontal tabulator) |
\v |
Vertikal-Tabulatorzeichen (von englisch vertical tabulator) |
\xhh.. |
Direkte Zeichenauswahl durch folgende Hexadezimalziffern hh (von hexadezimal). Beispiel: \x40 entspricht dem Zeichen '@'.Falls die so gebildete Hexadezimalzahl größer ist, als in einem Zeichen dargestellt werden kann, ist das Ergebnis implementierungsabhängig. |
\ooo |
Direkte Zeichenauswahl durch folgende ein bis drei Oktalziffern ooo. Beispiel \100 entspricht dem Zeichen '@'.Die Kurzform mit einer oder zwei Oktalziffern kann nur benutzt werden, wenn keine weitere Oktalziffer folgt. \0 (Nullzeichen, NUL) ist ein Spezialfall dieser Regel. |
\uhhhh |
Unicode-Zeichen; Es müssen stets vier Hexadezimalziffern hhhh folgen. Beispiel:\u20ac für das Euro-Symbol U+20AC "€" |
\Uhhhhhhhh |
Unicode-Zeichen, insbesondere wenn dieses außerhalb Plane 0 liegt; Es müssen stets acht Hexadezimalziffern folgen. Beispiel: \U0001D49C steht für das Unicode-Zeichen U+1D49C 𝒜 (MATHEMATICAL SCRIPT CAPITAL A) |
Der Backslash (auch Rückstrich oder umgekehrter Schrägstrich) dient in dieser Form jedoch auch als Maskierungszeichen, um Zeichen des Basis-Zeichensatzes von C, also alle Zeichen, die eigentlich eine Bedeutung und Funktion innehaben, auch ohne deren Funktion verwenden zu können; das betrifft auch den Backslash selbst. Das heißt, will man Teile der sog. Grafiksymbole von C, das sind die Zeichen ! " % & / ( ) [ ] { } \ ? = ' # + * ~ - _ . : ; , | < > ^
, als reines Textzeichen verwenden, so müssen diese (teilweise) mit dem Backslash als Maskierungszeichen verwendet werden.
\' |
Das Zeichen ' , einfaches Anführungszeichen |
\" |
Das Zeichen " , doppeltes Anführungszeichen |
\? |
Das Fragezeichen ? |
\\ |
Das Zeichen \ , Backslash (umgekehrter Schrägstrich) |
Maskierungszeichen zum Verhindern einer Escape-Sequenz
Da eine Escape-Sequenz durch mindestens eines der verfügbaren Zeichen eingeleitet wird, stehen fortan genau diese Zeichen nicht mehr für normalen Text zur Verfügung, da diese ja speziellen Funktionen zugeordnet werden (Funktionszeichen). Bei der Programmiersprache C ist dies der Backslash. Durch den Einfluss von C, der auch der starken Verbreitung geschuldet ist, finden sich dieselben Escape-Sequenzen auch in anderen Zusammenhängen wieder, z. B. in bestimmten Konfigurationsdateien oder auch auf einem Terminal (z. B. unter Unix, Linux oder macOS), u. a. bei der Angabe von Dateinamen.
Technisch gesehen leitet ein Maskierungszeichen ebenfalls eine Escape-Sequenz ein, jedoch ist die Funktion dieser Escape-Sequenz die, das ihr folgende Zeichen auszugeben. Die Funktion ermöglicht demnach die Nutzung des ursprünglichen Zeichens ohne deren zugeordneter Funktion.
Beispiel:
user@computer:~$ touch $HOME/Dokumente/Eine\ Datei\ mit\ Leerzeichen\ und\ einem\ \"Fragezeichen\"\?.txt
Dieser Befehl erstellt unter unixartigen Systemen (z. B. Linux oder macOS) im Benutzerverzeichnis die Datei Eine Datei mit Leerzeichen und einem "Fragezeichen"?.txt
im Verzeichnis Dokumente
(das Verzeichnis muss allerdings bereits existieren). Da auf einem Terminal das Leerzeichen als Trennzeichen interpretiert wird, muss es maskiert werden (englisch the character has to be escaped). Ebenso verhält es sich mit dem Anführungszeichen in einem Dateinamen: Da es normalerweise eine Zeichenkette einleitet und beendet, muss es maskiert werden, um als Zeichen verwendet zu werden. Und das Fragezeichen wird normalerweise als Wildcard interpretiert.
Im World Wide Web übernimmt das Prozentzeichen eine ähnliche Funktion beim URL-Encoding.
Weblinks
- Code Codex: – Liste von Escape-Sequenzen in verschiedenen Computersprachen
- Epson ESC/P Reference (PDF; 6,3 MB)
- HP PCL/PJL Reference (PCL 5 Printer Language) – Technical Reference Manual Part I (bpl13210) (englisch, PDF, 2,97 MB)
- Escape-Sequenzen: Sonderzeichen für Verwendung in URL
Einzelnachweise
- Computermuseum München: Geschichte der Seiko Epson Corporation
- HP PCL/PJL Reference Seite 6-5 (englisch, PDF, 2,97 MB)
- ECMA-48 (englisch)
- Standard ECMA-48 Fifth Edition – June 1991 – Control Functions for Coded Character Sets. (PDF) Ecma International, Juni 1991, S. 53–54, abgerufen am 5. Mai 2015 (englisch).
- Digital Equipment Corporation: VT100 Users Guide Kapitel 3 (englisch, PDF)
- DEC Terminals (englisch)
- Invisible Island: Xterm (englisch)
- Über ANSI Terminals: Ansi-Terminal Support
- Esc-Sequenzen erklärt anhand von ANSI/VT100 Terminals
- Wyse-50 Quick-Reference Seite 17 ff, (englisch)
- VT100 Users Guide Seite 3-18 (englisch, PDF)
- Wyse-50 Quick-Reference Seite 9 (englisch)