ANSI-Escapesequenzen oder ANSI-Escapecodes sind Zeichenfolgen zur Bildschirmsteuerung (Escapesequenzen), die das ASCII-/ANSI-Zeichen 27 (1B hexadezimal), „Escape“, als einleitendes Steuerzeichen nutzten 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

In den 1970er-Jahren wurde der ASCII-Standard, der bereits 1968 festgelegt worden war, durch das American National Standards Institute (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 European Computer Manufacturers Association (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.

Standards

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 7-bit Coded Character Set USAS X3.4 ECMA-6 ISO/IEC 646
1971 Character Code Structure and Extension Techniques ANSI X3.41 ECMA-35 ISO/IEC 2022
1974 8-bit Coded Character Set Structure and Rules  ? ECMA-43 ISO/IEC 4873
1979 Control Functions for Coded Character Sets ANSI X3.64 ECMA-48 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.

ANSI-Steuerzeichen und -Steuersequenzen

Der ASCII-Standard nach ECMA-6 (ANSI X3.4) definiert C0-Steuerzeichen (im Bereich 0–31 dezimal bzw. 00–1F hexadezimal) und ist auf 7 Bits begrenzt. Die Erweiterung auf 8 Bit nach ECMA-43 beinhalten die als C1 bezeichneten Steuerzeichen im Bereich von 128–159 dezimal bzw. 80–9F hexadezimal für die Bildschirm- und Druckersteuerung. Weil jedoch der Platz für Steuerzeichen begrenzt war, wurden zusätzliche Befehle und Funktionen über Steuersequenzen implementiert.

Während ein Steuerzeichen eine Funktion direkt umsetzt, sind bei einer Steuersequenz mehrere Zeichen notwendig. Die Anzahl der Zeichen ist je nach Funktion unterschiedlich. Die primären Steuerzeichen liegen im C1-Bereich und sind daher nur auf Systemen mit 8-Bit-Zeichensätzen verfügbar. Sie sind nach ANSI X3.64 bzw. ECMA-48 standardisiert und beinhalten Cursor-Befehle, Bildschirm-Befehle (Lösch-, Attribut-, Modus-Befehle) und Tastatur-Befehle.

Escapesequenzen

Damit aber auch 7-Bit-Systeme von den erweiterten ANSI-Steuerzeichen und -Steuersequenzen profitieren können, wurden sogenannte Escapesequenzen eingeführt. Es gibt von den meisten Steuerzeichen im C1-Bereich ein Äquivalent dazu über eine Escapesequenz, die somit auch auf Systemen mit 7-Bit-Zeichensatz – dem ASCII-Zeichensatz – verfügbar sind. Diese wurden als „ANSI-Escapesequenzen“ (englisch ANSI escape sequences, manchmal auch ANSI escape codes) bekannt.

ANSI-Steuerzeichen

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.

7-Bit-Äquivalent (C0) zu den erweiterten 8-Bit-Steuerzeichen (C1)
Steuerbefehl C1-Position C0-Positionen
Zeichenname ISO IETF Hex Dez Okt Escapesequenz Hex Dez Okt
Padding CharacterPADPA 80128200 ESC @ 1B 40027 06433 100
High Octet PresetHOPHO 81129201 ESC A 1B 41027 06533 101
Break Permitted HereBPHBH 82130202 ESC B 1B 42027 06633 102
No Break HereNBHNH 83131203 ESC C 1B 43027 06733 103
IndexINDIN 84132204 ESC D 1B 44027 06833 104
Next LineNELNL 85133205 ESC E 1B 45027 06933 105
Start of Selected AreaSSASA 86134206 ESC F 1B 46027 07033 106
End of Selected AreaESAES 87135207 ESC G 1B 47027 07133 107
Character Tabulation SetHTSHS 88136210 ESC H 1B 48027 07233 110
Character Tabulation with JustificationHTJHJ 89137211 ESC I 1B 49027 07333 111
Line Tabulation SetVTSVS 8A138212 ESC J 1B 4A027 07433 112
Partial Line ForwardPLDPD 8B139213 ESC K 1B 4B027 07533 113
Partial Line BackwardPLUPU 8C140214 ESC L 1B 4C027 07633 114
Reverse Line FeedRIRI 8D141215 ESC M 1B 4D027 07733 115
Single Shift 2SS2S2 8E142216 ESC N 1B 4E027 07833 116
Single Shift 3SS3S3 8F143217 ESC O 1B 4F027 07933 117
Device Control StringDCSDC 90144220 ESC P 1B 50027 08033 120
Private Use OnePU1P1 91145221 ESC Q 1B 51027 08133 121
Private Use TwoPU2P2 92146222 ESC R 1B 52027 08233 122
Set Transmit StateSTSTS 93147223 ESC S 1B 53027 08333 123
Cancel CharacterCCHCC 94148224 ESC T 1B 54027 08433 124
Message WaitingMWMW 95149225 ESC U 1B 55027 08533 125
Start Protected AreaSPASG 96150226 ESC V 1B 56027 08633 126
End Protected AreaEPAEG 97151227 ESC W 1B 57027 08733 127
Start Of StringSOSSS 98152230 ESC X 1B 58027 08833 130
Single Graphic Character IntroducerSGCIGC 99153231 ESC Y 1B 59027 08933 131
Single Character IntroducerSCISC 9A154232 ESC Z 1B 5A027 09033 132
ROI 9A154232 ESC % 1B 25027 03733 45
Control Sequence IntroCSICI 9B155233 ESC [ 1B 5B027 09133 133
String TerminatorSTSI 9C156234 ESC \ 1B 5C027 09233 134
Operating System CommandOSCOC 9D157235 ESC ] 1B 5D027 09333 135
Privacy MessagePMPM 9E158236 ESC ^ 1B 5E027 09433 136
Application Program CommandAPCAC 9F159237 ESC _ 1B 5F027 09533 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.

Zeichensätze

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.

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

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.

Steuersequenzen

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, Escape
  • SCI, Single Character Introducer bzw. ROI auf VT100-Terminals
  • CSI, Control Sequence Intro

Nur das Steuerzeichen ESC liegt im ASCII-Bereich und ist daher ein 7-Bit-kompatibles C0-Steuerzeichen. Die beiden C1-Steuerzeichen SCI bzw. ROI 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

Das Steuerzeichen „Single Character Introducer“ (SCI) leitet eine Steuersequenz mit nur einem einzigen zusätzlichen 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.

<ESC>Z<Funktion>

Die jeweilige proprietäre Funktion wird mit der Escapesequnz ESC Z eingeleitet, gefolgt von einer definierten Funktion. Da der ECMA-/ANSI-Standard keine standardisierten Funktionen festlegt, kann jede Implementierung eigene proprietäre Funktionen festlegen.

Auf DECs VT100 wird dasselbe C1-Steuerzeichen (154 bzw. 9Ahex) für das proprietäre Steuerzeichen ROI verwendet, das jedoch mit einer anderen Escapesequenz eingeleitet wird: ESC %. Anders als CSI ist ROI jedoch von variabler Länge.

Viele Terminalemulationen bieten einen VT100-kompatiblen Modus.

Beispiel:

<ESC>%0K

Die Steuersequenz ROI 0 K schaltet die Tastatur aus. Mit ROI 1 K wird sie wieder eingeschaltet.

<ESC>%1I

Mit der Steuersequenz ROI 1 I kann die aktuelle IP-Adresse abgefragt werden. Die Rückgabe hat das Format ROI ? <IP-Adresse> I.

Control Sequence Intro

Das Steuerzeichen „Control Sequence Intro“ (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.

Sicherheit

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.

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. Aber auch moderne Terminals sind noch anfällig für Terminal Escape Injection.

Implementierungen

Hardware:

  • DEC VT100 und dessen Nachfolgemodelle (VT102, VT220, VT320, VT420, VT520)
  • Heathkit H89 und Terminal-Varianten (H19; auch als Zenith Z19)

Software:

Einzelnachweise

  1. ANSI: Historical Overview (englisch); abgerufen am 27. März 2016. Das American National Standards Institute (ANSI) hieß vor 1969 United States of America Standards Institute (USASI).
  2. ECMA-6 (englisch)
  3. ECMA-35 (englisch)
  4. ECMA-43 (englisch)
  5. ECMA-48 (englisch)
  6. ISO International Register of Coded Character Sets To Be Used With Escape Sequences (englisch, PDF, 153 kB); abgerufen am 28. März 2016
  7. 1 2 Aivosto: Control characters in ASCII and Unicode (englisch), Abschnitt History of C1; Zitat: The standards actually cover more control codes than those that fit in the C1 area. These additional controls are used via control sequences (escape sequences). […] the sequences are an important part of the standards that should be used together with the C1 controls. The sequences, together with C1, are also known as VT100 and ANSI escape sequences.
  8. Programming: ANSI.SYS Escape Sequences (englisch); abgerufen am 26. März 2016.
  9. Aivosto, Resources for developers: Control characters in Unicode (englisch); abgerufen am 28. März 2016.
  10. 1 2 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-Buchsuche).
  11. Viel Farbenpracht mit Ansi-Bomben. (Memento des Originals 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.
  12. Terminal Escape Injection. (Blog) InfosecMatter, 16. April 2020, abgerufen am 16. Oktober 2020 (englisch).
  13. ANSI.SYS MSDN; abgerufen am 26. März 2016 (englisch).
  14. manpage: console codes (englisch)
  15. Ask Felgall (Computer Help): OS/2 Command Reference (englisch); abgerufen am 5. April 2016.
  16. Nivot Ink Blog: Windows 10 TH2 (v1511) Console Host Enhancements (englisch), Oisin Grehan, 4. Februar 2016; abgerufen am 26. März 2016.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.