Zwischen den Wörtern „Hello“ und „world“ wurde eine neue Zeile eingefügt.

Ein Zeilenumbruch (häufig auch Zeilenende , Zeilenende ( EOL ), nächste Zeile ( NEL ) oder Zeilenumbruch genannt ) ist ein Steuerzeichen oder eine Folge von Steuerzeichen in Zeichenkodierungsspezifikationen wie ASCII , EBCDIC , Unicode usw. Ein Zeilenumbruch wird verwendet, um das Ende einer Textzeile und den Beginn einer neuen zu kennzeichnen . [ 1 ]

Geschichte

Mitte des 19. Jahrhunderts, lange vor der Erfindung von Fernschreibern und Telegrafen, entwickelten und nutzten Morsecode- Operatoren oder Telegrafisten Morsecode-Zeichen, um Leerzeichen in schriftlichen Textnachrichten zu kodieren. Insbesondere das Morsecode -Zeichen BT (mnemonic break text), dargestellt durch die Verkettung der Morsecode-Zeichen „B“ und „T“ ohne den üblichen Abstand zwischen den Zeichen, dient im Morsecode dazu, einen Zeilenumbruch oder einen neuen Abschnitt in einer schriftlichen Textnachricht zu kennzeichnen.

Später, im Zeitalter moderner Fernschreiber , wurden standardisierte Zeichensatz-Steuercodes entwickelt, um die Formatierung von Texten mit Leerzeichen zu vereinfachen. ASCII wurde zeitgleich von der Internationalen Organisation für Normung (ISO) und der American Standards Association (ASA) entwickelt, der Vorgängerorganisation des American National Standards Institute (ANSI). In den Jahren 1963 bis 1968 unterstützten die ISO-Normentwürfe entweder die Verwendung von Wagenrücklauf und Zeilenvorschub ( CR + LF ) oder nur LF als Zeilenumbruch, während die ASA-Entwürfe ausschließlich CR + LF vorsahen .

Die Sequenz CR + LF wurde häufig auf frühen Computersystemen verwendet, die Fernschreiber – typischerweise ein Teletype Model 33 ASR – als Konsolengerät einsetzten , da diese Sequenz erforderlich war, um die Drucker am Anfang einer neuen Zeile zu positionieren. Die Aufteilung des Zeilenumbruchs in zwei Funktionen verschleierte die Tatsache, dass der Druckkopf nicht rechtzeitig vom äußersten rechten Rand zum Anfang der nächsten Zeile zurückkehren konnte, um das nächste Zeichen zu drucken. Jedes Zeichen, das nach einem CR gedruckt wurde , erschien oft als Fleck in der Mitte des Papiers, während der Druckkopf den Wagen noch in die Ausgangsposition zurückfuhr. „Die Lösung bestand darin, den Zeilenumbruch in zwei Zeichen aufzuteilen: CR , um den Wagen in die erste Spalte zu bewegen, und LF, um das Papier nach oben zu bewegen.“ [ 2 ] Tatsächlich war es oft notwendig, zusätzliche Füllzeichen – überflüssige CRs oder NULs – zu senden , die zwar ignoriert wurden, dem Druckkopf aber Zeit gaben, zum linken Rand zu fahren. Viele frühe Bildschirme benötigten ebenfalls mehrere Zeichen, um den Bildschirm zu scrollen .

Auf solchen Systemen mussten Anwendungen direkt mit der Fernschreibmaschine kommunizieren und deren Konventionen befolgen, da das Konzept von Gerätetreibern, die solche Hardwaredetails vor der Anwendung verbergen, noch nicht ausgereift war. Daher wurde Text routinemäßig so verfasst, dass er den Anforderungen der Fernschreibmaschinen entsprach. Die meisten Minicomputersysteme von DEC verwendeten diese Konvention. Auch CP/M nutzte sie, um auf denselben Terminals zu drucken, die auch Minicomputer verwendeten. Von dort übernahm MS-DOS (1981) die CR + LF- Konvention von CP/M , um kompatibel zu sein, und diese Konvention wurde später von Microsofts Windows- Betriebssystem übernommen.

Das Betriebssystem Multics wurde ab 1964 entwickelt und verwendete ausschließlich LF als Zeilenumbruch. Multics nutzte einen Gerätetreiber, um dieses Zeichen in die vom Drucker benötigte Sequenz (einschließlich Füllzeichen ) zu übersetzen. Das einzelne Byte war zudem programmiertechnisch praktischer. Die naheliegendere Wahl – CR – wurde nicht verwendet, da CR die nützliche Funktion bot, Zeilen mit anderen zu überschreiben und so Fettdruck , Unterstrich und Durchstreichung zu erzeugen . Noch wichtiger war jedoch, dass die Verwendung von LF als alleinigem Zeilenumbruch bereits in Entwürfen des späteren ISO/IEC-646 -Standards vorgesehen war. Unix folgte der Multics-Praxis, und spätere Unix-ähnliche Systeme orientierten sich an Unix. Dies führte zu Konflikten zwischen Windows und Unix-ähnlichen Betriebssystemen , da Dateien, die auf einem Betriebssystem erstellt wurden, von einem anderen Betriebssystem nicht korrekt formatiert oder interpretiert werden konnten (beispielsweise ein UNIX-Shell-Skript, das in einem Windows-Texteditor wie Notepad geschrieben wurde [ 3 ] [ 4 ] ).

Darstellung

Die Konzepte Wagenrücklauf (CR) und Zeilenvorschub (LF) sind eng miteinander verbunden und können sowohl getrennt als auch zusammen betrachtet werden. Bei Schreibmaschinen und Druckern sind zwei Bewegungsachsen – „nach unten“ und „nach links“ – erforderlich, um eine neue Zeile auf dem Papier zu erzeugen . Obwohl die Konstruktion einer Maschine (Schreibmaschine oder Drucker) diese getrennt berücksichtigen muss, kann die abstrakte Logik der Software sie zu einem einzigen Ereignis zusammenfassen. Daher kann ein Zeilenumbruch in der Zeichenkodierung als definiert CRund LFzu einem kombiniert werden (üblicherweise als CR+LFoder bezeichnet CRLF).

Einige Zeichensätze bieten einen separaten Zeilenumbruchcode. EBCDIC beispielsweise stellt neben den Codes CR und LF auch den Code NL bereit. Unicode bietet neben den ASCII- Steuercodes CR und LF auch den Steuercode für die nächste Zeile ( NEL ) sowie Steuercodes für Zeilen- und Absatztrennzeichen. Im Block „Control Pictures“ enthält Unicode außerdem druckbare Zeichen zur visuellen Darstellung von Zeilenvorschub (␊), Wagenrücklauf (␍) und anderen C0- Steuercodes (sowie einen generischen Zeilenumbruch, ΐ�) .

Darstellung eines Zeilenumbruchs mit einem oder zwei Steuerzeichen in Softwareanwendungen und Betriebssystemen
BetriebssystemZeichenkodierungAbkürzung Hexadezimalwert​ Dezimalwert​ Fluchtsequenz
Multics POSIX- Standardorientierte Systeme: Unix- und Unix-ähnliche Systeme ( Linux , macOS , *BSD , AIX , Solaris , Xenix usw.), QNX 4+ Andere: BeOS , Amiga , RISC OS und andere [ 5 ]ASCIILF0A10\N
Windows , MS-DOS- kompatible Systeme, Atari TOS , DEC TOPS-10 , RT-11 , CP/M , MP/M , OS/2 , Symbian OS , Palm OS , Amstrad CPC und die meisten anderen frühen Nicht-Unix- und Nicht-IBM-Betriebssysteme CR LF0D 0A13 10\r\n
Commodore 64 , Commodore 128 , Acorn BBC , ZX Spectrum , TRS-80 , Apple II , Oberon , klassisches Mac OS , HP Series 80 , MIT Lisp Machine und OS-9CR0D13\R
Acorn BBC [ 6 ] und RISC OS Spooled Text Output [ 7 ]LF CR0A 0D10 13\n\r
QNX -Implementierung vor POSIX (Version < 4) RS1E30036
Atari 8-Bit-ComputerATASCIIEOL9B155
IBM- Großrechnersysteme, einschließlich z/OS ( OS/390 ) und IBM i ( OS/400 ) EBCDICNL1521025
ZX80 und ZX81 (Heimcomputer von Sinclair Research Ltd ) ZX80 / ZX81 proprietäre Codierung 76118
  • EBCDIC- Systeme – hauptsächlich IBM- Großrechnersysteme, darunter z/OS ( OS/390 ) und IBM i ( OS/400 ) – verwenden NL (New Line, 0x15 ) [ 8 ] als Zeichen, das die Funktionen von Zeilenvorschub und Wagenrücklauf vereint. Das entsprechende Unicode-Zeichen heißt NEL (Next Line). EBCDIC kennt außerdem die Steuerzeichen CR und LF , wobei der numerische Wert von LF ( 0x25 ) sich von dem in ASCII ( 0x0A ) unterscheidet. Einige EBCDIC-Varianten verwenden ebenfalls NL , weisen dem Zeichen aber einen anderen numerischen Code zu. Diese Betriebssysteme nutzen ein datensatzbasiertes Dateisystem , das Textdateien als einen Datensatz pro Zeile speichert. In den meisten Dateiformaten werden keine Zeilenumbrüche gespeichert.0x85
  • Die Betriebssysteme der CDC-6000-Serie definierten einen Zeilenumbruch als zwei oder mehr Null-wertige 6-Bit-Zeichen am Ende eines 60-Bit-Wortes. In manchen Konfigurationen wurde ein Null-wertiges Zeichen auch als Doppelpunkt definiert , sodass mehrere Doppelpunkte je nach Position als Zeilenumbruch interpretiert werden konnten.
  • RSX-11 und OpenVMS verwenden ebenfalls ein datensatzbasiertes Dateisystem, das Textdateien als einen Datensatz pro Zeile speichert. In den meisten Dateiformaten werden keine Zeilenumbrüche gespeichert, aber die Record Management Services (RMS) können beim Abruf durch eine Anwendung transparent einen Zeilenumbruch hinzufügen. Die Datensätze selbst können dieselben Zeilenumbruchzeichen enthalten, was je nach Anwendung als Vorteil oder Nachteil empfunden werden kann. RMS speichert nicht nur Datensätze, sondern auch Metadaten über die Datensatztrennzeichen in verschiedenen Bits der Datei, was die Sache noch komplizierter macht (da Dateien Datensätze fester Länge, Datensätze mit einem vorangestellten Zähler oder Datensätze, die mit einem bestimmten Zeichen abgeschlossen werden, enthalten können). Die Bits sind nicht generisch; sie können zwar angeben, dass CR, LF , LF oder sogar CR der Zeilenumbruch ist, aber sie können keinen anderen Code ersetzen.
  • Einige frühe Mainframe -Betriebssysteme verwendeten eine feste Zeilenlänge . In solchen Systemen wurde beispielsweise alle 72 oder 80 Zeichen ein implizites Zeilenende angenommen. Es wurden keine Zeilenumbruchzeichen gespeichert. Beim Import einer Datei mussten Zeilen, die kürzer als die Zeilenlänge waren, mit Leerzeichen aufgefüllt und längere Zeilen abgeschnitten werden. Dies ahmte die Verwendung von Lochkarten nach , auf denen jede Zeile auf einer separaten Karte gespeichert war, üblicherweise mit 80 Spalten, oft mit fortlaufenden Nummern in den Spalten 73–80. Viele dieser Systeme fügten am Anfang des nächsten Datensatzes ein Wagensteuerzeichen hinzu . Dieses konnte angeben, ob der nächste Datensatz eine Fortsetzung der Zeile des vorherigen Datensatzes, eine neue Zeile oder eine Überschreibung der vorherigen Zeile (ähnlich einem CR ) sein sollte. Oft handelte es sich dabei um ein normales Druckzeichen, das daher nicht als erstes Zeichen einer Zeile verwendet werden konnte. Einige frühe Zeilendrucker interpretierten diese Zeichen direkt in den ihnen gesendeten Datensätzen.#

Kommunikationsprotokolle

Viele Kommunikationsprotokolle verwenden eine bestimmte Zeilenumbruchkonvention. Insbesondere die von der Internet Engineering Task Force (IETF) veröffentlichten Protokolle verwenden typischerweise die ASCII-CRLF-Sequenz.

In einigen älteren Protokollen kann auf die neue Zeile ein Prüfsummen- oder Paritätszeichen folgen.

Unicode

Der Unicode- Standard definiert eine Reihe von Zeichen, die konforme Anwendungen als Zeilenumbrüche erkennen sollten: [ 9 ]

 LF :Leitungszufuhr, U+000A
 VT :Vertikaler Tabulator , U+000B
 FF :Formvorschub , U+000C
 CR :Wagenrücklauf , U+000D
 CR + LF :CR ( U+000D ) gefolgt von LF ( U+000A )
 NEL :Nächste Zeile, U+0085
 LS :Zeilentrenner, U+2028
 PS :Absatztrennzeichen, U+2029

Auch wenn es im Vergleich zu einem Ansatz wie der Umwandlung aller Zeilenumbrüche in ein einzelnes Zeichen (z. B. LF ) übermäßig kompliziert erscheinen mag, muss Unicode, da es die vollständige Informationserhaltung bei der Konvertierung einer Textdatei von einer beliebigen Kodierung nach Unicode und zurück gewährleistet ( Round-Trip-Integrität ), die gleichen Unterscheidungen zwischen Zeilenumbrüchen anderer Kodierungen treffen. Beispielsweise kennt EBCDIC die Zeichen NL , CR und LF , daher müssen alle drei auch in Unicode vorhanden sein.

Die meisten Zeilenumbruchzeichen und -sequenzen gehören zu den C0-Steuerelementen des ASCII- Codes (d. h. sie haben Unicode-Codepunkte bis 0x1F ). Die drei Zeilenumbruchzeichen außerhalb dieses Bereichs – NEL , LS und PS – werden von Software oft nicht als Zeilenumbrüche erkannt. Zum Beispiel:

Unicode enthält einige Glyphen, die dazu bestimmt sind, dem Leser des Dokuments ein für den Benutzer sichtbares Zeichen darzustellen und daher selbst nicht als Zeilenumbruch erkannt werden:

  • U+23CE ⏎ RÜCKGABESYMBOL
  • U+240A ␊ Symbol für Leitungsvorschub
  • U+240D ␍ Symbol für Rückladung
  • U+2424 ␤ Symbol für Zeilenumbruch

HTML

In HTML sind Zeilenumbrüche Leerzeichen und werden im Allgemeinen wie Leerzeichen behandelt . [ 16 ] Absätze werden mithilfe separater Instanzen des HTML-Elements<p> erstellt , wobei die physische Trennung der Absätze von der Rendering-Engine gesteuert wird. [ 17 ]

Zeilenumbrüche können explizit mit dem HTML-Element <br> erzeugt werden <br>. Um die Lesbarkeit von Seiten durch Screenreader zu verbessern, rät die HTML-Dokumentation davon ab, dieses Element für Absätze zu verwenden. Stattdessen wird unter anderem von MDN Web Docs empfohlen, dieses Element für Gedichte zu verwenden . [ 18 ]

In Programmiersprachen

Um die Erstellung portabler Programme zu vereinfachen, bieten Programmiersprachen Abstraktionen für den Umgang mit den verschiedenen Arten von Zeilenumbruchsequenzen, die in unterschiedlichen Umgebungen verwendet werden.

Die Programmiersprache C stellt die Escape-Sequenzen für Zeilenumbruch\n (Newline) und Wagenrücklauf (Carrier Return) bereit. Diese müssen jedoch nicht den ASCII- Steuerzeichen LF und CR\r entsprechen . Der C-Standard garantiert lediglich zwei Eigenschaften:

  1. Jede dieser Escape-Sequenzen ist einer eindeutigen, implementierungsabhängigen Zahl zugeordnet, die in einem Zeichenwert gespeichert werden kann .
  2. Beim Schreiben in eine Datei, einen Geräteknoten oder einen Socket/FIFO im Textmodus wird \ndas Zeilenumbruchzeichen transparent in die systemeigene Zeilenumbruchsequenz übersetzt, die länger als ein Zeichen sein kann. Beim Lesen im Textmodus wird die systemeigene Zeilenumbruchsequenz wieder in das Zeilenumbruchzeichen übersetzt \n. Im Binärmodus findet keine Übersetzung statt, und die interne Darstellung \nwird direkt ausgegeben.

Auf Unix -Betriebssystemen , dem Ursprungsland von C, ist die native Zeilenumbruchsequenz ASCII LF ( 0x0A ), weshalb sie einfach auf diesen Wert festgelegt wurde. Da die interne und externe Darstellung identisch sind, hat die Übersetzung im Textmodus keine Auswirkung , und Unix kennt keinen Unterschied zwischen Text- und Binärmodus. Dies hat dazu geführt, dass viele Programmierer, die ihre Software auf Unix-Systemen entwickelt haben, diese Unterscheidung einfach ignoriert haben, was zu Code geführt hat, der nicht auf andere Plattformen portierbar ist. \n

Die Funktion `fgets ()` der C-Standardbibliothek sollte im Binärmodus möglichst vermieden werden, da Dateien, die nicht der Unix-Zeilenumbruchkonvention entsprechen, falsch interpretiert werden. Auch im Textmodus werden Dateien, die nicht der systemeigenen Zeilenumbruchsequenz entsprechen (z. B. Dateien, die auf einem Unix-System erstellt und anschließend auf ein Windows-System kopiert wurden), falsch interpretiert.

Ein weiteres häufiges Problem ist die Verwendung von ASCII CR + LF\n bei der Kommunikation über ein Internetprotokoll, das die Verwendung dieser Zeichenketten am Zeilenende vorschreibt. Das Schreiben in einen Textdatenstrom funktioniert unter Windows korrekt, erzeugt unter Unix jedoch nur LF und auf exotischeren Systemen etwas völlig anderes. Die Verwendung im Binärmodus ist etwas besser. \n\r\n

Viele Sprachen, wie C++ , Perl , [ 19 ] und Haskell, bieten die gleiche Interpretation \nwie C. C++ verfügt über ein alternatives Eingabe-/Ausgabemodell (E/A), bei dem der Manipulator std::endl verwendet werden kann, um einen Zeilenumbruch auszugeben (und den Stream-Puffer zu leeren).

Java , PHP [ 20 ] und Python [ 21 ] stellen die Sequenz (für ASCII CR + LF ) bereit. Im Gegensatz zu C ist garantiert , dass diese die Werte U+000D bzw. U+000A repräsentieren . \r\n

Die Ein-/Ausgabemethoden der Java-Klassenbibliothek übersetzen diese nicht transparent in plattformabhängige Zeilenumbruchsequenzen. Stattdessen bieten sie Funktionen zum Schreiben einer vollständigen Zeile, die automatisch die native Zeilenumbruchsequenz hinzufügen, sowie Funktionen zum Lesen von Zeilen, die CR , LF oder CR + LF als Zeilenumbruch akzeptieren (siehe BufferedReader.readLine() ). Mit der Methode System.lineSeparator() kann der zugrunde liegende Zeilenumbruch abgerufen werden. Dieser wird auch automatisch eingefügt, wenn der Formatbezeichner verwendet wird . %nSystem.out::printf

Beispiel:

String eol = System.lineSeparator ( ); String lineColor = "Color: Red " + eol ;

Python verfügt standardmäßig über eine „universelle Unterstützung für Zeilenumbrüche“, die alle drei gängigen Konventionen für Zeilenumbrüche ( \n, \r, \r\n) in die Python- Standardkonvention übersetzt, wenn eine Datei zum Lesen geöffnet, Module importiert oder ausgeführt wird. Diese Funktion kann beim Öffnen der Datei über das Argument `newline` \ngesteuert werden . [ 22 ] [ 23 ]newlineopen()

Einige Programmiersprachen verwenden spezielle Variablen , Konstanten und Unterprogramme , um Zeilenumbrüche während der Programmausführung zu ermöglichen. In Sprachen wie PHP und Perl sind doppelte Anführungszeichen erforderlich, um Escape-Sequenzen, einschließlich `\n` \nund `\n` , zu ersetzen \r. In PHP sollten Zeilenumbrüche aus Gründen der Portabilität mithilfe der Konstante `PHP_EOL` erzeugt werden. [ 24 ]

Beispiel in C# :

string eol = Environment.NewLine ; string lineColor = "Color: Red" + eol ; string eol2 = " \n" ; string lineColor2 = " Color: Blue" + eol2 ;

Probleme mit unterschiedlichen Zeilenumbruchformaten

Eine mit gedit erstellte und mit einem Hex-Editor angezeigte Textdatei . Neben den Textobjekten enthält sie lediglich Zeilenumbruchzeichen mit dem Hexadezimalwert 0A.

Die unterschiedlichen Konventionen für Zeilenumbrüche führen dazu, dass Textdateien, die zwischen Systemen unterschiedlicher Art übertragen wurden, falsch angezeigt werden.

Text in Dateien, die mit Programmen erstellt wurden, die unter Unix-ähnlichen Systemen oder dem klassischen Mac OS üblich sind , erscheint in den meisten Programmen, die unter MS-DOS und Microsoft Windowsline feed üblich sind, als eine einzige lange Zeile, da diese Programme ein einzelnes Zeichen oder ein einzelnes Zeichen nicht carriage returnals Zeilenumbruch anzeigen.

Umgekehrt kann beim Betrachten einer Datei, die von einem Windows-Computer stammt, auf einem Unix-ähnlichen System das zusätzliche CR als zweiter Zeilenumbruch, als ^M oder als <cr> am Ende jeder Zeile angezeigt werden.

Darüber hinaus akzeptieren andere Programme als Texteditoren möglicherweise eine Datei, z. B. eine Konfigurationsdatei, die mit der fremden Zeilenumbruchkonvention kodiert ist, nicht als gültige Datei.

Das Problem kann schwer zu erkennen sein, da manche Programme die fremden Zeilenumbrüche korrekt verarbeiten, andere hingegen nicht. Beispielsweise kann ein Compiler mit schwer verständlichen Syntaxfehlern fehlschlagen, obwohl die Quelldatei in der Konsole oder im Editor korrekt angezeigt wird . Moderne Texteditoren erkennen in der Regel alle Varianten von CR- und LF -Zeilenumbrüchen und ermöglichen die Konvertierung zwischen den verschiedenen Standards. Webbrowser können üblicherweise auch Textdateien und Websites mit unterschiedlichen Zeilenumbruchtypen korrekt darstellen.

Selbst wenn ein Programm verschiedene Zeilenumbruchkonventionen unterstützt, sind diese Funktionen oft nicht ausreichend beschriftet, beschrieben oder dokumentiert. Typischerweise wird Benutzern ein Menü oder eine Auswahlliste mit verschiedenen Zeilenumbruchkonventionen angezeigt, ohne dass angegeben wird, ob die Auswahl die Zeilenumbrüche neu interpretiert, vorübergehend oder dauerhaft konvertiert. Einige Programme konvertieren Zeilenumbrüche implizit beim Öffnen, Kopieren, Einfügen oder Speichern – oft inkonsistent.

Die meisten textbasierten Internetprotokolle (darunter HTTP , SMTP , FTP , IRC und viele andere) schreiben die Verwendung von ASCII CR + LF ( , 0x0D 0x0A ) auf Protokollebene vor, empfehlen aber, dass tolerante Anwendungen auch einzelne LF ( , 0x0A ) erkennen . Trotz des vorgegebenen Standards verwenden viele Anwendungen fälschlicherweise die C - Escape - Sequenz für Zeilenumbrüche ( LF ) anstelle der korrekten Kombination aus Wagenrücklauf- und Zeilenumbruch-Escape-Sequenz ( CR + LF ) (siehe Abschnitt „Zeilenumbruch in Programmiersprachen“ oben). Diese versehentliche Verwendung der falschen Escape-Sequenzen führt zu Problemen bei der Kommunikation mit Systemen, die die strengere Auslegung der Standards anstelle der empfohlenen toleranten Auslegung befolgen. Ein solches intolerantes System ist der Mail Transfer Agent qmail , der aktiv die Annahme von Nachrichten von Systemen verweigert, die nur LF anstelle des erforderlichen CR + LF senden . [ 25 ]\r\n\n\n\r\n

Das Standard-Internet-Nachrichtenformat [ 26 ] für E-Mails besagt: „CR und LF dürfen nur zusammen als CRLF auftreten; sie dürfen nicht einzeln im Nachrichtentext vorkommen.“ Unterschiede zwischen SMTP-Implementierungen in der Behandlung von LF- und/oder CR-Zeichen haben zu SMTP-Spoofing-Angriffen geführt, die als „SMTP-Smuggling“ bezeichnet werden. [ 27 ]

Das File Transfer Protocol (FTP) kann Zeilenumbrüche in Dateien, die zwischen Systemen mit unterschiedlichen Zeilenumbruchdarstellungen übertragen werden, automatisch konvertieren , wenn die Übertragung im „ASCII-Modus“ erfolgt. Die Übertragung von Binärdateien in diesem Modus führt jedoch in der Regel zu schwerwiegenden Problemen: Jede Zeilenumbruch-Bytefolge – die in diesem Kontext keine Zeilenumbruchssemantik besitzt, sondern Teil einer normalen Bytefolge ist – wird in die vom Zielsystem verwendete Zeilenumbruchdarstellung übersetzt, wodurch die Datei beschädigt wird . FTP-Clients verwenden häufig Heuristiken (z. B. die Überprüfung der Dateinamenerweiterungen ), um automatisch den Binär- oder ASCII-Modus auszuwählen. Letztendlich liegt es jedoch in der Verantwortung der Benutzer, sicherzustellen, dass ihre Dateien im richtigen Modus übertragen werden. Im Zweifelsfall sollte der Binärmodus verwendet werden, da die Dateien dann von FTP nicht verändert werden, auch wenn sie möglicherweise falsch angezeigt werden. [ 28 ]

Konvertierung zwischen Zeilenumbruchformaten

Texteditoren werden häufig verwendet, um eine Textdatei zwischen verschiedenen Zeilenumbruchformaten zu konvertieren; die meisten modernen Editoren können Dateien lesen und schreiben, die mindestens die verschiedenen ASCII CR / LF Konventionen verwenden.

Der Editor Vim kann beispielsweise eine Datei so umwandeln, dass sie mit dem Windows-Texteditor Notepad kompatibel ist. Innerhalb von Vim

 : set fileformat = dos  : wq

Editoren eignen sich unter Umständen nicht für die Konvertierung größerer Dateien oder die Massenkonvertierung vieler Dateien. Für größere Dateien (unter Windows NT) wird häufig folgender Befehl verwendet:

D:\> TYPE unix_file | FIND /V "" > dos_file 

Spezielle Programme zur Konvertierung von Dateien zwischen verschiedenen Zeilenumbruchkonventionen sind beispielsweise unix2dos und dos2unix , mac2unix und unix2mac , mac2dos und dos2mac sowie flip . [ 29 ] Der Befehl tr ist auf nahezu jedem Unix-ähnlichen System verfügbar und ermöglicht beliebige Ersetzungsoperationen an einzelnen Zeichen. Eine DOS/Windows-Textdatei lässt sich in das Unix-Format konvertieren, indem man einfach alle ASCII- CR- Zeichen entfernt.

$ tr -d '\r' < Eingabedatei > Ausgabedatei

oder, falls der Text nur CR- Zeilenumbrüche enthält, indem alle CR- Zeilenumbrüche mit LF in LF umgewandelt werden

$ tr '\r' '\n' < Eingabedatei > Ausgabedatei

Die gleichen Aufgaben werden manchmal mit awk , sed oder in Perl ausgeführt , falls die Plattform über einen Perl-Interpreter verfügt:

$ awk '{sub("$","\r\n"); printf("%s",$0);}' Eingabedatei > Ausgabedatei # UNIX zu DOS (Hinzufügen von CRs auf Linux- und BSD-basierten Betriebssystemen ohne GNU-Erweiterungen) $ awk '{gsub("\r",""); print;}' Eingabedatei > Ausgabedatei # DOS zu UNIX (Entfernen von CRs auf Linux- und BSD-basierten Betriebssystemen ohne GNU-Erweiterungen) $ sed -e 's/$/\r/' Eingabedatei > Ausgabedatei # UNIX zu DOS (Hinzufügen von CRs auf Linux-basierten Betriebssystemen mit GNU-Erweiterungen) $ sed -e 's/\r$//' Eingabedatei > Ausgabedatei # DOS zu UNIX (Entfernen von CRs auf Linux-basierten Betriebssystemen mit GNU-Erweiterungen) $ perl -pe 's/\r?\n|\r/\r\n/g' Eingabedatei > Ausgabedatei # Konvertierung zu DOS $ perl -pe 's/\r?\n|\r/\n/g' Eingabedatei > Ausgabedatei # Konvertierung zu UNIX $ perl -pe 's/\r?\n|\r/\r/g' Eingabedatei > Ausgabedatei # Konvertierung zu altem Mac

Der Befehl „file“ kann die Art der Zeilenumbrüche ermitteln:

$ file myfile.txt myfile.txt: ASCII-Text in englischer Sprache mit CRLF-Zeilenumbrüchen

Mit dem Unix- Befehl egrep (extended grep) lassen sich die Dateinamen von Unix- oder DOS-Dateien ausgeben (vorausgesetzt, es handelt sich nur um Dateien im Unix- und DOS-Stil, nicht um Dateien im klassischen Mac OS-Stil):

$ egrep -L '\r\n' myfile.txt # UNIX-Datei anzeigen (LF-terminiert) $ egrep -l '\r\n' myfile.txt # DOS-Datei anzeigen (CRLF-terminiert)

Andere Werkzeuge ermöglichen es dem Benutzer, die Zeilenumbruchzeichen zu visualisieren:

$ od -a meine Datei.txt $ cat -e meine Datei.txt $ cat -v meine Datei.txt $ hexdump -c meine Datei.txt 

Interpretation

Es gibt zwei in sich konsistente Betrachtungsweisen für Zeilenumbrüche : Entweder trennen sie Zeilen oder sie beenden sie. Wird ein Zeilenumbruch als Trennzeichen betrachtet, folgt nach der letzten Zeile einer Datei kein weiterer Zeilenumbruch. Manche Programme haben Probleme mit der Verarbeitung der letzten Zeile einer Datei, wenn diese nicht durch einen Zeilenumbruch abgeschlossen wird. Programme, die einen Zeilenumbruch als Trennzeichen erwarten, interpretieren einen abschließenden Zeilenumbruch hingegen als Beginn einer neuen (leeren) Zeile. Wird ein Zeilenumbruch hingegen als Abschlusszeichen betrachtet, wird erwartet, dass alle Textzeilen, einschließlich der letzten, durch einen Zeilenumbruch abgeschlossen werden. Ist die letzte Zeichenfolge einer Textdatei kein Zeilenumbruch, kann die letzte Zeile als fehlerhaft oder unvollständig betrachtet werden, oder die Datei kann als fehlerhaft abgeschnitten gelten. Der POSIX- Standard vertritt die letztere Position und betrachtet Zeilenumbrüche als Zeilenumbrüche. [ 30 ]

In Texten, die primär von Menschen mit Software gelesen werden, die den automatischen Zeilenumbruch unterstützt , muss ein Zeilenumbruchzeichen in der Regel nur dann gespeichert werden, wenn ein Zeilenumbruch erforderlich ist, unabhängig davon, ob das nächste Wort in dieselbe Zeile passt, beispielsweise zwischen Absätzen oder in Listen. Daher wird in der Logik von Textverarbeitungsprogrammen und den meisten Texteditoren der Zeilenumbruch als Absatzumbruch verwendet und als „fester Zeilenumbruch“ bezeichnet. Im Gegensatz dazu werden „weiche Zeilenumbrüche“ dynamisch erzeugt, um den automatischen Zeilenumbruch zu implementieren und können bei jeder Anzeige angepasst werden. In vielen Anwendungen gibt es ein separates Steuerzeichen namens „manueller Zeilenumbruch“, um Zeilenumbrüche innerhalb eines Absatzes zu erzwingen. Das Glyphe für das Steuerzeichen eines festen Zeilenumbruchs ist üblicherweise ein Absatzzeichen (¶), und für den manuellen Zeilenumbruch ist es üblicherweise ein Wagenrücklaufpfeil (↵).

Rückwärts- und Teilvorschub

RI ( U +008D Zeilenumbruch, [ 31 ] ISO/IEC 6429 8D, dezimal 141) dient dazu, die Druckposition um eine Zeile zurückzuverschieben (durch Rückwärtstransport des Papiers oder durch Anheben des Cursors um eine Zeile), sodass andere Zeichen über bestehenden Text gedruckt werden können. Dies kann beispielsweise zum Fettdruck, zum Hinzufügen von Unterstreichungen, Durchstreichungen oder anderen Zeichen wie diakritischen Zeichen verwendet werden . Der Zeilenumbruch wurde  im Hacker’s Dictionary als „Line Starve “ bezeichnet  – ein Wortspiel mit „ Line Feed “ (Zeilenvorschub) . [ 32 ]

Ebenso können PLD ( U +008B PARTIAL LINE FORWARD, Dezimal 139) und PLU ( U +008C PARTIAL LINE BACKWARD, Dezimal 140) verwendet werden, um die Textausgabe um einen Bruchteil des vertikalen Zeilenabstands (typischerweise die Hälfte) vor- oder zurückzuverschieben. Diese Befehle lassen sich für Tiefstellungen (durch Vor- und Zurückschieben) und Hochstellungen (durch Zurückschieben und Vor- und Zurückschieben) kombinieren und sind auch für die Ausgabe von diakritischen Zeichen nützlich.

Siehe auch

Anmerkungen

  1. ^ Zeilenumbrüche innerhalb von z. B.<PRE>...</PRE>werden berücksichtigt.

Referenzen

  1. ^ „Was ist ein Zeilenumbruch?“ . www.computerhope.com . Abgerufen am 10. Mai 2021 .
  2. ^ Qualline, Steve (2001). Vi verbessert – Vim (PDF) . Sams Publishing . P.  120 . ISBN 9780735710016Archiviert vom Original (PDF) am 8. April 2022. Abgerufen am 4. Januar 2023 .
  3. ^ Duckett, Chris. „Windows Notepad versteht endlich die Zeilenumbruchzeichen anderer Systeme“ . ZDNet . Archiviert vom Original am 13. Mai 2018. Abgerufen am 4. Januar 2023. Nach jahrzehntelanger Frustration und der Notwendigkeit, einen richtigen Texteditor herunterzuladen, um eine einzige Zeile in einer Konfigurationsdatei unter Linux zu ändern, hat Microsoft Notepad aktualisiert, sodass es nun die in Unix-, Linux- und macOS-Umgebungen verwendeten Zeilenumbruchzeichen verarbeiten kann.
  4. ^ Lopez, Michel (8. Mai 2018). „Einführung erweiterter Zeilenumbruchunterstützung in Notepad“ . Windows Command Line . Archiviert vom Original am 6. April 2019. Abgerufen am 4. Januar 2023. Wie bei jeder Änderung an einem etablierten Tool besteht die Möglichkeit, dass dieses neue Verhalten in Ihren Anwendungsfällen nicht funktioniert oder dass Sie es deaktivieren und zum ursprünglichen Verhalten von Notepad zurückkehren möchten. Dazu können Sie [...Registrierungsschlüssel...] ​​ändern, um anzupassen, wie Notepad das Einfügen von Text handhabt und welches Zeilenumbruchzeichen beim Drücken der Eingabetaste verwendet wird.
  5. ^ Kahn-Greene, Will Guaraldi. "ASCII-Tabelle" . bluesock.org .
  6. ^ Bray, Andrew C.; Dickens, Adrian C.; Holmes, Mark A. (1983). The Advanced User Guide for the BBC Microcomputer (PDF) . Cambridge Microcomputer Centre. S. 103, 104. ISBN 978-0946827008Abgerufen am 30. Januar 2019 .
  7. ^ „Zeichenausgabe“ . RISC OS 3 Programmierhandbuch . 3QD Developments Ltd. 3. November 2015. Abgerufen am 18. Juli 2018 .
  8. ^ IBM System/360 Referenzdatenkarte, Publikation GX20-1703, IBM Data Processing Division, White Plains, NY
  9. ^ Heninger, Andy (20. September 2013). „UAX #14: Unicode-Zeilenumbruchalgorithmus“ . Das Unicode-Konsortium.
  10. ^ Bray, Tim (März 2014). „JSON-Grammatik“ . Das JavaScript Object Notation (JSON) Datenaustauschformat . IETF . Abschnitt 2. doi : 10.17487/RFC7159 . RFC 7159 .
  11. ^ Bray, Tim (März 2014). „Strings“ . Das JavaScript Object Notation (JSON) Datenaustauschformat . IETF . Abschnitt 7. doi : 10.17487/RFC7159 . RFC 7159 .
  12. ^ a b „ECMAScript 2019 Language Specification“ . ECMA International. Juni 2019. 11.3 Zeilenumbrüche .
  13. ^ „ECMAScript 2019 Language Specification“ . ECMA International. Juni 2018. 11.3 Zeilenumbrüche .
  14. ^ "Subsume JSON (aka JSON ⊂ ECMAScript)" . GitHub . 22. Mai 2018.
  15. ^ "5.4. Zeilenumbruchzeichen" . YAML Ain't Markup Language Revision 1.2.2 . 1. Oktober 2021.
  16. ^ „Hypertext Markup Language“ . info.cern.ch. CERN . Abgerufen am 15. August 2025 .
  17. ^ "<p>: Das Absatzelement - HTML" . MDN . Mozilla. 13. August 2025.
  18. ^ "<br>: Das Zeilenumbruch-Element - HTML" . MDN . Mozilla. 9. Juli 2025. Abgerufen am 15. August 2025 .
  19. ^ "binmode" . Perl-Dokumentation . Perl 5 Porters.
  20. ^ "PHP: Strings - Handbuch" . PHP-Handbuch . Die PHP-Gruppe.
  21. ^ „2. Lexikalische Analyse“ . Die Python-Sprachreferenz . Die Python Foundation.
  22. ^ Jansen, Jack (14. Januar 2002). „PEP 278 – Universelle Unterstützung für Zeilenumbrüche“ . Python Enhancement Proposals . Python Software Foundation. Abschnitt Spezifikation.
  23. ^ „Neues in Python 2.3“ . Python 2.3 . Python Software Foundation. Abschnitt Allgemeines, Universelle Zeilenumbrüche. Universelle Zeilenumbrüche – Dateien, die mit dem speziellen Modus „U“ (anstatt „r“) zum Lesen geöffnet werden, übersetzen alle drei gängigen Zeilenumbruchkonventionen (n, r, rn) in die Python-Standardkonvention n. Beitrag von Jack Jansen. (PEP 278)
  24. ^ „PHP: Vordefinierte Konstanten – Handbuch“ . PHP-Handbuch . Die PHP-Gruppe.
  25. ^ Bernstein, DJ "Bare LFs in SMTP" .
  26. ^ Resnick, Pete (April 2001). Internet Message Format . IETF . doi : 10.17487/RFC2822 . RFC 2822 .
  27. ^ Longin, Timo (18. Dezember 2023). „SMTP-Schmuggel – E-Mail-Spoofing weltweit“ . SEC Consult .
  28. ^ Zeil, Steven (19. Januar 2015). „Dateiübertragung“ . Old Dominion University. Archiviert vom Original am 14. Mai 2016. Im Zweifelsfall im Binärmodus übertragen.
  29. ^ Sapp, Craig Stuart. „ASCII-Textkonvertierung zwischen UNIX, Macintosh und MS-DOS“ . Center for Computer Research in Music and Acoustics. Archiviert vom Original am 9. Februar 2009.
  30. ^ „3. Definitionen § 3.185 Zeile“ . The Open Group Base Specifications Issue 8, IEEE Std 1003.1-2024 . The IEEE und The Open Group. 3.185 Zeile: Eine Folge von null oder mehr Nicht-<newline>-Zeichen plus einem abschließenden <newline>-Zeichen.Eine ausführlichere Erläuterung der Implikationen dieser Definition einer Linie finden Sie unter https://stackoverflow.com/a/729795
  31. ^ „C1 Controls and Latin-1 Supplement“ (PDF) . unicode.org . Abgerufen am 13. Februar 2016 .
  32. ^ Spears, Richard A.; Steele, Guy L. (1986). Woods, Donald R.; Finkel, Raphael A.; Crispin, Mark R.; Stallman, Richard M.; Goodfellow, Geoffrey S.; Abel, Ernest L. (Hrsg.). „Two Specialty Dictionaries“ . American Speech . 61 (3): 273–277 . doi : 10.2307/454671 . ISSN 0003-1283 . Einige Einträge enthalten typische Computerterminologie. … Der Begriff „Line feed“ wird zur Erklärung des Wortspiels „line starve“ aufgeführt .