ANSI-Escapesequenz
ANSI-Escapesequenzen oder ANSI-Escapecodes sind Zeichenfolgen zur Bildschirmsteuerung (Escapesequenzen), die das ASCII-/ANSI-Zeichen 27 (1B hexadezimal), „Escape“, als einleitendes Steuerzeichen nutzen und auf dem Standard von ANSI X3.64 und ECMA-48 beruhen. Diese ANSI/ECMA-Norm definiert einen Standard zur Bildschirm- und Tastatursteuerung auf Terminals wie der DEC VT100 (1979). Außer auf Terminals selbst sind ANSI-Escapesequenzen in entsprechenden Terminalemulationen und in Kommandozeileninterpretern implementiert.
Die 2. Ausgabe von ECMA-48 wurde 1978 als ISO 6429 und mit der 4. Ausgabe 1986 als ISO/IEC 6429 standardisiert. Der aktuelle ECMA-48-Standard entspricht der 5. Ausgabe vom Juni 1991.
Geschichte[Bearbeiten]
In den 1970er Jahren wurde der ASCII-Standard, der bereits 1968 festgelegt worden war, durch das {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) (ANSI) überarbeitet. Dieser als ANSI X3.4-1977 bezeichnete Standard definiert jedoch nur die ersten 7 Bit, wurde als die ASCII-Zeichentabelle bekannt und bildet die Grundlage für weitere internationale Zeichensätze. Die ersten Arbeiten zur Standardisierung eines 8-Bit-Zeichensatzes resultierten bereits 1971 in ANSI X3.41 und ECMA-35. Gemeinsam mit der {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) (ECMA) wurde in den Komitees mit den Bezeichnungen „X3L2“ bei ANSI und „TC 1“ bei ECMA an der Erweiterung der 8-Bit-Eingabe- und -Ausgabesteuerung gearbeitet, was u. a. die Möglichkeiten der Videoausgabe auf Terminals erweitern und gleichzeitig standardisieren sollte. Das Ergebnis dieser Arbeit ist ECMA-48 vom September 1976 sowie ANSI X3.64 von 1977. Diese Spezifikation wurde auch dem ISO-Komitee vorgelegt und 1978 als ISO 6429 akzeptiert. Die 2. Ausgabe von ANSI X3.64 und ECMA-48 von 1979 ist identisch mit der ISO-Norm.
Die ersten Terminals, die ANSI X3.64-1977 umsetzten, waren der DEC-VT100-Terminal von 1978 und der Heathkit H89 von 1979.<ref name="inv-vt100">DEC Terminals. Invisible Island (englisch).</ref> Wegen ihres kommerziellen Erfolgs wurden die VT100-Terminals kontinuierlich weiterentwickelt, wobei auf Abwärtskompatibilität geachtet wurde, so dass auch die späteren Modelle im Wesentlichen dem ANSI-Standard folgten.<ref name="vt420-ref">VT420 Reference Manual: Abschnitt D (Compatibility). (PDF; 1,5 MB) vt100.net (englisch).</ref> Aufbauend auf VT100 entstand außerdem im Unix-Bereich die xterm-Emulation.<ref>Xterm. Invisible Island (englisch).</ref> Deren gleichnamiger Terminaltyp ist heute in gängigen Terminalemulationen quasi Standard,<ref>Setting Your Terminal Type. cs.odu.edu (englisch).</ref> so dass die Steuerung von Terminals und Konsolen zur Nutzung von Unix-Shells heute im Prinzip (über den Umweg Xterm und VT100) auf die ANSI-Escapesequenzen des ECMA-48/ANSI-X3.64-Standards zurückgehen. Ähnliches gilt für PCs, wo ursprünglich DOS bzw. die Eingabeaufforderung den ANSI-Standard unterstützten<ref name="MSDN_ANSI.SYS">ANSI.SYS MSDN; abgerufen am 26. März 2016 (englisch).</ref> und das Fenster für den Kommandozeileninterpreter in Windows 10 inzwischen auf xterm basiert.<ref name="win10-xterm">Über ANSI-Terminals: ANSI-Terminal Unterstützung. learn.microsoft.com</ref>
Standards[Bearbeiten]
Der Standard wurde mit minimalen Abweichungen sowohl von ANSI als auch ECMA herausgegeben und nach Einreichung auch zur ISO- und IEC-Norm. Allerdings sind nur die ECMA-Standards frei zugänglich (gratis). Der ANSI-Standard wurde zugunsten der ISO-Norm zurückgezogen, um Doppelstandardisierung zu vermeiden.
| Jahr | Bezeichnung | ANSI | ECMA | ISO/IEC |
|---|---|---|---|---|
| 1965 | {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | USAS<ref>ANSI: Historical Overview (englisch); abgerufen am 27. März 2016. Das {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) (ANSI) hieß vor 1969 {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) (USASI).</ref> X3.4 | ECMA-6<ref name="ECMA6">ECMA-6. ecma-international.org (englisch).</ref> | ISO/IEC 646 |
| 1971 | {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | ANSI X3.41 | ECMA-35<ref name="ECMA35">ECMA-35. ecma-international.org (englisch).</ref> | ISO/IEC 2022 |
| 1974 | {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | ? | ECMA-43<ref name="ECMA43">ECMA-43 ecma-international.org (englisch).</ref> | ISO/IEC 4873 |
| 1979 | {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | ANSI X3.64 | ECMA-48<ref name="ECMA48">ECMA-48. ecma-international.org (englisch).</ref> | ISO/IEC 6429 |
Die Standards sind aufbauend und miteinander verwoben – wurde einer der Standards angepasst, so wurde meist auch eine angepasste Version der anderen Standards veröffentlicht. Leider gibt es dennoch in unterschiedlichen Implementierungen und Dokumenten (sogar Standards und Normen) zueinander inkompatible Steuerzeichen und -sequenzen.<ref>Die Seite Vorlage:Webarchiv/styles.css hat keinen Inhalt.ISO International Register of Coded Character Sets To Be Used With Escape Sequences. ( des Vorlage:IconExternal vom 29. September 2018 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis. (PDF; 153 kB) itscj.ipsj.or.jp (englisch); abgerufen am 28. März 2016</ref>
ANSI-Steuerzeichen und -Steuersequenzen[Bearbeiten]
Der ASCII-Standard nach ECMA-6 (ANSI X3.4) ist auf 7 Bits begrenzt und definiert die Codierung von 96 Buchstaben und Symbolen, sowie 32 so genannten C0-Steuerzeichen (im Bereich 0–31 dezimal bzw. 00–1Fhexadezimal).<ref name="ECMA6" />
Die Erweiterung auf 8 Bit nach ECMA-43 fügt im Bereich von 128–159 dezimal (bzw. 80–9Fhexadezimal) Raum für 32 weitere Steuerzeichen hinzu, jedoch ohne deren Funktion konkret zu spezifizieren.<ref name="ECMA43" />
Steuerzeichen[Bearbeiten]
Im Standard ECMA-48 (ANSI X3.64) von 1977 wurden dann, aufbauend auf die in den vorherigen Standards vorgeschlagenen Code-Bereiche, die Funktion der C0- und C1-Steuerzeichen tatsächlich präzise definiert.<ref name="ECMA48-83">ECMA-48: Kapitel 8.3 Definition of Control Functions. ecma-international.org (englisch).</ref>
Escapesequenzen[Bearbeiten]
Weil jedoch der Platz für die Steuerzeichen auf 64 Funktionen begrenzt ist, wurden zusätzlich zu den Steuerzeichen weitere Befehle und Funktionen über so genannte Steuersequenzen implementiert.<ref name="aivosto_historyC1">Control characters in ASCII and Unicode. Aivosto (englisch), Abschnitt {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value); Zitat: “{{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)”</ref>
Während nämlich ein Steuerzeichen eine Funktion direkt umsetzt, besteht eine Steuersequenz aus mehreren Zeichen. Deren Anzahl ist je nach Funktion unterschiedlich, die möglichen Kombinationen sind jedoch im Standard genau spezifiziert. Da einige der primären Steuerzeichen im C1-Bereich liegen und daher nur auf Systemen mit 8-Bit-Zeichensätzen verfügbar sind, legt der ECMA-48 Standard für die meisten Steuerzeichen im C1-Bereich auch Kombination aus 7 Bit Zeichen fest (s. u.).
Durch die mögliche Kombination von mehreren Zeichen zu einer Sequenz ergibt sich die Möglichkeit weit mehr als 64 Steuerfunktionen festzulegen, bzw. diese Funktionen zu parametrisieren (z. B. einer Funktion einen Wiederholungsfaktor beizufügen). Dementsprechend beschreibt der Standard insgesamt 162<ref name="ECMA48-83" /> Steuercodes und Sequenzen, die teilweise komplexe Funktionen ausführen, wie z. B. Cursor-Steuerung, Bildschirm-Befehle (Lösch-, Attribut-, Modus-Befehle) und Tastatur-Befehle.<ref name="ECMA48-83" /><ref>Programming: ANSI.SYS Escape Sequences. evergreen.edu (englisch); archiviert Oktober 2017.</ref> Diese wurden als „ANSI-Escapesequenzen“ ({{Modul:Vorlage:lang}} Modul:Vorlage:lang:103: attempt to index field 'wikibase' (a nil value), manchmal auch {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)) bekannt.<ref name="aivosto_historyC1" />
Zeichensätze[Bearbeiten]
In den meisten Zeichensätzen sind die C0- und C1-Steuerzeichen an den normierten Positionen enthalten. Außer auf emulierten VT100-Terminals finden jedoch fast nur C0-Steuerzeichen Verwendung.<ref>Control characters in Unicode. Aivosto, Resources for developers (englisch); abgerufen am 28. März 2016.</ref>
Bei der Entwicklung von Unicode wurden diese ebenfalls übernommen, sodass in Unicode die Steuerzeichen gem. ANSI X3.64 und ECMA-48 innerhalb der ersten 256 Positionen abgebildet sind. ANSI-Escapesequenzen sind bei Unicode zwar ohne Funktion, jedoch wurden einige der Funktionen an anderer Unicode-Position ähnlich umgesetzt (z. B. ein geschütztes Leerzeichen).
Steuerzeichen[Bearbeiten]
Die über eine Escapesequenz aufgerufene Funktion eines C1-Steuerzeichens hat gemäß Spezifikation genau die gleiche Funktion wie das einzelne Steuerzeichen. Als Escapesequenz bleiben Steuerzeichen innerhalb des 7-Bit-C0-Bereichs von ASCII und sind somit mit Systemen, die nur 7-Bit unterstützen oder in diesen Modus geschaltet wurden, kompatibel.
C1-Steuerzeichen im ANSI ECMA-48 Standard[Bearbeiten]
Dies ist ein Auszug von C1-Steuerzeichen aus dem 8-Bit-„ANSI“-Zeichensatz, die mittels Escapesequenzen (C0-Steuerzeichen an ASCII-Position 27) im 7-Bit-ASCII-Zeichensatz zugänglich sind. Die genaue Funktion dieser Steuerzeichen, z. B. welche Funktion ein Reverse Line Feed genau ausführt, ist im Kapitel 8.3 des EMCA-48 Standards festgelegt.<ref name="ECMA48-83" />
| Steuerbefehl | C1-Position | C0-Positionen | |||||||
|---|---|---|---|---|---|---|---|---|---|
| Zeichenname | ISO | IETF | Hex | Dez | Okt | Escapesequenz | Hex | Dez | Okt |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | PAD | PA | 80 | 128 | 200 | ESC @ | 1B 40 | 027 064 | 33 100 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | HOP | HO | 81 | 129 | 201 | ESC A | 1B 41 | 027 065 | 33 101 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | BPH | BH | 82 | 130 | 202 | ESC B | 1B 42 | 027 066 | 33 102 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | NBH | NH | 83 | 131 | 203 | ESC C | 1B 43 | 027 067 | 33 103 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | IND | IN | 84 | 132 | 204 | ESC D | 1B 44 | 027 068 | 33 104 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | NEL | NL | 85 | 133 | 205 | ESC E | 1B 45 | 027 069 | 33 105 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | SSA | SA | 86 | 134 | 206 | ESC F | 1B 46 | 027 070 | 33 106 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | ESA | ES | 87 | 135 | 207 | ESC G | 1B 47 | 027 071 | 33 107 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | HTS | HS | 88 | 136 | 210 | ESC H | 1B 48 | 027 072 | 33 110 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | HTJ | HJ | 89 | 137 | 211 | ESC I | 1B 49 | 027 073 | 33 111 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | VTS | VS | 8A | 138 | 212 | ESC J | 1B 4A | 027 074 | 33 112 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | PLD | PD | 8B | 139 | 213 | ESC K | 1B 4B | 027 075 | 33 113 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | PLU | PU | 8C | 140 | 214 | ESC L | 1B 4C | 027 076 | 33 114 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | RI | RI | 8D | 141 | 215 | ESC M | 1B 4D | 027 077 | 33 115 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | SS2 | S2 | 8E | 142 | 216 | ESC N | 1B 4E | 027 078 | 33 116 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | SS3 | S3 | 8F | 143 | 217 | ESC O | 1B 4F | 027 079 | 33 117 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | DCS | DC | 90 | 144 | 220 | ESC P | 1B 50 | 027 080 | 33 120 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | PU1 | P1 | 91 | 145 | 221 | ESC Q | 1B 51 | 027 081 | 33 121 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | PU2 | P2 | 92 | 146 | 222 | ESC R | 1B 52 | 027 082 | 33 122 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | STS | TS | 93 | 147 | 223 | ESC S | 1B 53 | 027 083 | 33 123 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | CCH | CC | 94 | 148 | 224 | ESC T | 1B 54 | 027 084 | 33 124 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | MW | MW | 95 | 149 | 225 | ESC U | 1B 55 | 027 085 | 33 125 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | SPA | SG | 96 | 150 | 226 | ESC V | 1B 56 | 027 086 | 33 126 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | EPA | EG | 97 | 151 | 227 | ESC W | 1B 57 | 027 087 | 33 127 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | SOS | SS | 98 | 152 | 230 | ESC X | 1B 58 | 027 088 | 33 130 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | SGCI | GC | 99 | 153 | 231 | ESC Y | 1B 59 | 027 089 | 33 131 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | SCI | SC | 9A | 154 | 232 | ESC Z | 1B 5A | 027 090 | 33 132 |
| ROI | 9A | 154 | 232 | ESC % | 1B 25 | 027 037 | 33 45 | ||
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | CSI | CI | 9B | 155 | 233 | ESC [ | 1B 5B | 027 091 | 33 133 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | ST | SI | 9C | 156 | 234 | ESC \ | 1B 5C | 027 092 | 33 134 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | OSC | OC | 9D | 157 | 235 | ESC ] | 1B 5D | 027 093 | 33 135 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | PM | PM | 9E | 158 | 236 | ESC ^ | 1B 5E | 027 094 | 33 136 |
| {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) | APC | AC | 9F | 159 | 237 | ESC _ | 1B 5F | 027 095 | 33 137 |
Zur Berechnung der Escapesequenz wird vom C1-Steuerzeichen 40h, 64 dezimal oder 100 oktal abgezogen. So hat beispielsweise das Steuerzeichen PAD die C1-Position 80h: zieht man 40h davon ab erhält man die Escapesequenz ESC @, weil das @-Zeichen die C0-Position 40h hat, also 80h-40h=40h. Ebenso verhält es sich bei in dezimal ausgedrückten Zeichenpositionen: 128-64=64 (entspricht 40h), sowie oktal: 200-100=100 (entspricht 40h).
Der einzige Nachteil der Escapesequenz ist, dass ein zusätzliches Zeichen pro Steuerbefehl verarbeitet werden muss, was auf langsamen Terminals zu Geschwindigkeitseinbußen führen konnte – zumindest theoretisch und wenn ein ANSI-Script sehr lang war. Nach der Spezifikation können alle 8-Bit-fähigen Geräte auch die 7-Bit-Escapefunktion nutzen, sodass sich die Escapesequenzen durchgesetzt haben.
Steuersequenzen[Bearbeiten]
Eine Steuersequenz wird immer durch ein Steuerzeichen eingeleitet und besteht mindestens aus zwei Zeichen. Bei variabler Größe wird die Steuersequenz durch ein definiertes abschließendes Zeichen oder durch ein Trennzeichen abgeschlossen. Eine Steuersequenz wird wie ein einzelnes Steuerzeichen behandelt, mit dem Unterschied, dass die gesamte Steuersequenz gelesen werden muss, bevor deren Umsetzung erfolgen kann.
Im Wesentlichen gibt es drei Steuerzeichen, die eine Steuersequenz einleiten:
ESC: {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)SCI: {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)CSI: {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)
Nur das Steuerzeichen ESC liegt im ASCII-Bereich und ist daher ein 7-Bit-kompatibles C0-Steuerzeichen. Die beiden C1-Steuerzeichen SCI und CSI können über eine Escapesequenz substituiert werden, womit die Steuersequenz dann ASCII-kompatibel auf 7-Bit beschränkt bleibt.
Die Steuerzeichen APC, DCS, OSC, PM und SOS leiten ebenfalls eine Steuersequenz ein und müssen mit dem Trennzeichen ST abgeschlossen werden.
Single Character Introducer[Bearbeiten]
Das Steuerzeichen „{{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)“ (SCI) leitet eine Steuersequenz mit nur einem einzigen darauffolgenden Zeichen ein und benötigt daher auch kein Trennzeichen. Da jedoch die Funktionen dieses Steuerzeichens nicht standardisiert wurden, bedeuten sie auf jedem System etwas anderes. Die jeweilige proprietäre Funktion wird mit der Escapesequenz ESC Z eingeleitet, gefolgt von einem Zeichen, das eine proprietär definierte Funktion auslöst. Da der ECMA-/ANSI-Standard keine standardisierten Funktionen festlegt, kann jede Implementierung eigene proprietäre Funktionen festlegen. Zum Beispiel könnte eine Terminalemulation konform zum Standard für sich die Sequenz <ESC> Z K verwenden, um die Tastatur zu deaktivieren. Unter VT100 und seinem 8-Bit fähigen Nachfolger VT220 wird SCI nicht verwendet.<ref>DEC: VT220 Programmer Reference Manual. (PDF; 2,4 MB) vt100.net (englisch).</ref>
Control Sequence Intro[Bearbeiten]
Das Steuerzeichen „{{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value)“ (CSI) ist das meist genutzte Steuerzeichen, da es eine Vielzahl weiterer Funktionen bietet, die sonst nicht mehr in den verfügbaren Rahmen von nur 8 Bit gepasst hätten. Es wird mit dem Zeichen 9Bhex im 8-Bit-Modus, meist jedoch als Escapesequenz ESC [ im 7-Bit-Modus, also 1Bhex 5Bhex, eingeleitet.
Eine CSI-Steuersequenz setzt sich immer aus einem einleitenden Steuerzeichen oder der entsprechenden Escapesequenz, einem Parameterteil und einem abschließenden Zeichen zusammen, wobei letzteres die Funktion bestimmt. Im Parameterteil wird der Strichpunkt ; als Trennzeichen genutzt. Der Parameterteil ist optional bzw. es gibt meist einen Standardparameter, wenn dieser fehlt.
<ESC> [ 0 ; 1 ; 4 m
| | | | |
+---+--+ +-----+-----+ |
| | |
Steuerzeichen | abschließendes Zeichen
Parameterteil
In diesem Beispiel ist ESC [ das einleitende Steuerzeichen CSI als Escapesequenz, gefolgt von den Parametern 0;1;4, abgeschlossen durch das Zeichen m, das die eigentliche Funktion bestimmt.
Wird der Parameterteil weggelassen, so sieht die Steuersequenz so aus:
<ESC>[m
Diese Steuersequenz ist gleichbedeutend mit ESC [ 0 m, da 0 der Standardparameter ist.
Beispiele[Bearbeiten]
Der ECMA-48 Standard definiert auf S. 61 die Funktion SGR “Set Graphic Rendition” (Darstellungsformat) als CSI Ps... 06/13.<ref name="ECMA48" /> Das bedeutet, dass die Sequenz mit dem CSI-Zeichen (9Bhex) oder ESC [ (1Bhex 5Bhex) eingeleitet wird, dann einen oder mehrere Parameter hat und mit dem Zeichen m (6Dhex) abgeschlossen wird. Weiterhin legt der Standard dort fest, dass z. B. die Zahl 5 als Parameter blinkende Darstellung bedeutet, während die Zahl 31 eine Darstellung in rot bedeutet. Die Zahl 0 setzt die Darstellung auf Standard zurück. Eine vollständige solche Sequenz zur Einleitung der Darstellung von rot blinkendem Textes würde folglich so aussehen: ESC [ 5 ; 3 1 m (in einzelnen Bytes: 1B 5B 35 3B 33 31 6Dhex). Das Beenden der hervorgehobenen Darstellung erfolgte durch ESC [ 0 m (in einzelnen Bytes: 1B 5B 30 6Dhex).<ref name="ansiesc">ANSI.SYS Escape Sequences: Display Attribute and Mode Commands (englisch)</ref><ref name="ansi-erklaert">Esc-Sequenzen erklärt anhand von ANSI/VT100 Terminals</ref>
Da die Shells in moderne Computersystemen oft noch auf ANSI-Sequenzen basieren, lässt sich dies unter Unix bzw. Windows folgendermaßen demonstrieren:
Unix[Bearbeiten]
In einer Unix-Shell kann man das ESC Zeichen mittels des echo Befehls als \e ausgeben. Somit könnte man rot blinkenden Text, wie oben exemplarisch dargestellt, in einem Terminal-Fenster durch folgenden Befehl am Bildschirm anzeigen:<ref name="ansi-erklaert"/><ref>Peeking at command-line ANSI escape sequences (englisch)</ref>
echo -e "Der folgende Text ist \e[5;31m rot blinkend \e[0m."
Windows[Bearbeiten]
In einer Eingabeaufforderung (DOS Fenster) unter Windows wird $E als Teil des Eingabe-Prompts als ESC-Zeichen verstanden. Hiermit ist es möglich, die PROMPT Variable so zu setzen, dass sie farbigen Text enthält.<ref>Personalize your command prompt with ANSI Escape Codes (englisch)</ref><ref name="ansi-erklaert"/>
Beispielsweise würde
PROMPT=$E[5;31m Bitte Befehl eingeben $E[0m :
ein Prompt erzeugen, das rot blinkenden Text anzeigt, der den Benutzer auffordert einen Befehl einzugeben.
DOS[Bearbeiten]
In DOS muss der ANSI.SYS-Treiber geladen sein, um ANSI-Escapesequenzen nutzen zu können. Die ANSI-Escapesequenz wird durch die Eingabe des ASCII-Zeichens 27 (0x1B) eröffnet. Das ASCII-Zeichen 27 ist ein nicht druckbares Steuerzeichen und kann daher als Beispiel nicht angegeben werden. Die Eingabe des Zeichens kann aber bspw. mit der Tastenkombination Alt Gr+2+7 erfolgen, manche Texteditoren bieten auch eine spezielle Eingabemaske für ASCII-Zeichen, in der dann ASCII-Zeichen 27 ausgewählt werden kann.
Skriptfehler: Ein solches Modul „Vorlage:Anker“ ist nicht vorhanden. Sicherheit[Bearbeiten]
Da die Steuerzeichen auch dazu verwendet werden können, Tastatureingaben zu simulieren und umzudefinieren, kann eine Datei mit ANSI-Escapesequenzen auf einem Computer auch Schaden anrichten. Dabei ist es lediglich nötig, die Datei von einem voll ANSI-fähigen Programm anzeigen zu lassen, welches dann die enthaltenen Escapesequenzen ungefiltert ausführt. Diese Art der Schadfunktion wird auch als ANSI-Bombe bezeichnet.<ref name="Springer_Computerviren-und-ihre-Vermeidung_2013">Howard Fuhs: Computerviren und ihre Vermeidung: Ein übersichtlicher, praxisorientierter Leitfaden für jeden PC-Anwender. Springer-Verlag, 2013, ISBN 978-3-322-84213-8, S. 50 (Volltext in der Google-BuchsucheSkriptfehler: Ein solches Modul „Vorlage:GoogleBook“ ist nicht vorhanden.).</ref><ref>Die Seite Vorlage:Webarchiv/styles.css hat keinen Inhalt.Viel Farbenpracht mit Ansi-Bomben. ( des Vorlage:IconExternal vom 26. März 2016 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis. PC-Welt; abgerufen am 26. März 2016.</ref>
Zu Zeiten von MS-DOS konnte sogar mit einer manipulierten Laufwerksbezeichnung eine ANSI-Bombe realisiert werden, sodass ein dir a: ausreichte, wenn ANSI.SYS geladen war.<ref name="Springer_Computerviren-und-ihre-Vermeidung_2013" /> Aber auch moderne Terminals sind noch anfällig für {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value).<ref>Terminal Escape Injection. (Blog) InfosecMatter, 16. April 2020, abgerufen am 16. Oktober 2020 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref>
Implementierungen[Bearbeiten]
Hardware:
- DEC VT100 und dessen Nachfolgemodelle (VT102, VT220, VT320, VT420, VT520)
- Heathkit H89 und Terminal-Varianten (H19; auch als Zenith Z19)
Software:
- ANSI.SYS aus den IBM-PC-kompatiblen DOS-Betriebssystemen, wie u. a. PC DOS, MS-DOS, DR DOS<ref name="MSDN_ANSI.SYS"/>
- BBS-Clients wie Kermit oder Qmodem
- xterm<ref>console codes. man7.org, manpage (englisch).</ref>
- ANSI.SYS-Alternativen für DOS: ANSI.COM, NANSI.SYS, NNANSI.COM
- OS/2-Kommandozeile<ref>Ask Felgall (Computer Help): OS/2 Command Reference (englisch); abgerufen am 5. April 2016.</ref>
- Amiga console.device
- Eingabeaufforderung seit Windows 10 1511<ref name="win10-xterm" />
- Node.js-Bibliothek ANSIS für die Textgestaltung in ANSI-Terminals
Weblinks[Bearbeiten]
- ECMA-48 {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) in der aktuellen 5. Ausgabe vom Juni 1991 (englisch)
- Edward Moy, Stephen Gildea, Thomas Dickey: {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value). etla.org; XFree86, 1999 (englisch) – eine gute Referenz für ANSI-Escapesequenzen in xterm
Einzelnachweise[Bearbeiten]
<references responsive />