Zeilenwechsel

Das Speichern von Zeilen ist in der IT und der Programmierung das vermutlich seltsamste Konstrukt, das je umgesetzt wurde.

Hier stimmt nämlich gar nichts. Weder die dafür genutzten ASCII Zeichen, noch die unterschiedliche Implementierung auf den unterschiedlichen Plattformen.


Wenn es um von Menschen lesbaren Text und Textzeilen geht, so ist es doch logisch, dass eine handelsübliche Tastatur der Ausgangspunkt für alles Weitere ist.

Natürlich müssen wir uns noch darauf einigen, dass wir im PC Zeitalter leben, und hier eben ASCII Zeichencodes und IBM-PC kompatible Tastaturen als Referenz herangezogen werden und nicht die alten Heimcomputer wie Atari oder C64 und auch keine der frühen Großrechner.

Die RETURN Taste, zu deutsch: “Eingabetaste” - also die große mit dem abgewinkelten Pfeil, ist den alten Schreibmaschinen nachempfunden und stellt den Wechsel in die nächste Zeile dar, womit automatisch auch wieder zur Anfangsposition ganz links für die nächsten Tastenanschläge gerückt wurde.

Auf diesen alten Geräten gab es dafür einen eigenen “Hebel” auf der linken Seite, mit dem man die Schreibwalze manuell wieder nach rechts schieben und gleichzeitig in die nächste Zeile wechseln konnte.
Der Hebel rückte zuerst die Walze per Zahnrad eine Zeile weiter und das manuelle hinüberziehen schob den “Walzenwagen” nach rechts, womit der nächste Anschlag wieder links auf dem Blatt erfolgen konnte.

Der übliche BIOS Tastaturcode für diese RETURN Taste ist 13 im Dezimalsystem oder 0D im Hexadezimalsystem.

Programmiersprachen nutzen daher gerne das Kürzel CR für Carriage Return und den ASCII Wert 13. C-Sprachen kennen auch den Escapecode \r dafür.

Das klassische MacOS war das einzige System, das einen Zeilenwechsel auch mit genau diesem einen Zeichen (ASCII 13) in Dateien speicherte. Und eigentlich wäre das wohl auch logisch, dass immer wenn der User auf RETURN drückt auch genau dieser Code in der Textdatei landet.

Unix erwählte jedoch ein anderes ASCII Zeichen dafür aus, welches über die PC-Tastatur nicht abgebildet wird, nämlich “Line-Feed”, kurz LF mit dem ASCII Wert 10 bzw. 0A im Hexadezimalsystem, und C-Sprachen nutzen gerne \n als Escapecode dafür. Line-Feed steht für Zeilenvorschub. Drückt der Benutzer auf RETURN wurde also nicht ein CR sondern ein LF in die Datei bzw. den Textpuffer geschrieben.

Und was taten DOS und Windows? Hier diente offenbar die Schreibmaschine als Vorbild, denn hier landen beide Zeichen, nämlich zuerst CR und dann LF hintereinander in einer Datei, wenn RETURN gedrückt wurde.

Ich behaupte, dass auch diese Reihenfolge im Vergleich zur Schreibmaschine falsch ist, denn hier wird zuerst die Zeile gewechselt (LF) und dann der Wagen zurück gezogen (CR)

Schlimm genug, dass Windows und Unix (und damit auch Linux) hier zwei unterschiedliche binäre Schreibweisen umsetzten, doch das Chaos wird noch perfekter, wenn unter Windows bei der Nutzung der C-APIs jedes \n automatisch in ein CR + LF umgewandelt wird, um mit Unix Code-kompatibel zu bleiben. Wenn wir dann “versehentlich” unter Windows den String:

1fputs("Hello World\r\n", file);

speichern, dann steht in der Textdatei binär ein Hello World \r\r\n, was eigentlich ein Kodierungsfehler ist.

Man kann das zwar umgehen, in dem man Dateien in C gezielt “binär” öffnet, also z.B.:

1FILE* file = fopen("testfile.txt", "wb"); // write-binary

Doch das wird leicht vergessen.

Wenn man aber glaubt, dass mit dem Unix-Standard LF die ganze restliche Welt funktioniert, der scheitert dann wieder bei Netzwerkprotokollen. Denn hier ist die gleiche Konvention wie unter Windows mit CR + LF für das Ende einer Zeile umgesetzt. HTTP, FTP, SMTP und viele weitere Protokolle, die textbasiert sind, benötigen beide Zeichen um eine Befehlszeile abzuschließen.

Das wiederum erfordert von Unix-Systemen, dass sie eine RETURN-Eingabe in Programmen wie telnet auf CR + LF ausweiten.

Fazit

Also kurz gesagt: Textzeilenwechsel sind in der IT sehr unglücklich und unterschiedlich entwickelt worden. Ich verstehe nicht, warum es nicht beim originalen CR Code alleine geblieben ist, so wie es MacOS damals auch umgesetzt hatte.

Der Vollständigkeit halber sollten wir noch erwähnen, dass es dann noch eine zusätzliche Taste gibt, die ENTER heißt. Wir finden sie am Zahlenblock einer üblichen Tastatur und obwohl sie auf allen Betriebssystemen zum gleichen Ergebnis wie RETURN führt, so hat sie einen anderen Hardware-Scancode und war auf der originalen Tastatur des IBM-PC meines Wissens nicht verbaut.

Heute sprechen alle von der ENTER Taste, wenn sie in Wahrheit RETURN meinen oder drücken. Nur wenige Menschen nutzen die echte ENTER Taste, außer wenn ausschließlich Zahlen eingetippt und bestätigt werden müssen.


Und wer heute nicht mehr weiß, was eine Schreibmaschine ist (englisch: Typewriter), kann sich mit der Funktion per Video vertraut machen:

[ Youtube Video Link ]