Der Martin: Zeilenendezeichen feststellen

Beitrag lesen

Hallo,

* 0D0A, das ist das klassische Zeilenendezeichen in Windows.

und systemunabhängig in einigen Internet-Protokollen so vorgeschrieben (HTTP, SMTP).

* nur 0A ohne 0D davor, Linux

Ja, bis hin zu dessen Urahn Unix.

* Vielleicht gibts auch mal nur 0D, ohne nachfolgendes 0A?

Frühere Versionen von Mac OS, AFAIK. Und einige Heimcomputer-Systeme aus den 80er Jahren.

Jetzt würd ich nach den Varianten suchen die vorkommen könnten. Wahrscheinlich nur die ersten beiden, dann suchst du nach 0A. Hier ist auf jeden Fall ein Zeilenende, entweder mit 0D davor oder nicht. Alle 0A suchen und schauen was davor steht, dann hast du rausgefunden was als Zeilenende verwendet wird.

Ganz so einfach ist es nicht, aber mit absoluter Sicherheit kriegt man's wohl nicht raus. Man muss also mit einer gewissen Heuristik vorgehen:

* Zähle alle Linefeeds (0x0A), denen kein CR (0x0D) vorausgeht
 * Zähle alle CR (0x0D), denen kein Linefeed (0x0A) folgt
 * Zähle alle Paare aus 0x0D und 0x0A

Ist nun einer der drei ermittelten Werte _erheblich_ größer als die beiden anderen, hast du den verwendeten Code für den Zeilenumbruch gefunden; sind die anderen beiden Zähler 0, kann das Ergebnis als sicher gelten, sonst immerhin als "wahrscheinlich mit vereinzelten Contra-Indizien".

Rein hypothetisch könnte auch noch LF/CR (also erst 0x0A, dann 0x0D) auftreten. Das habe ich aber in freier Wildbahn noch nicht angetroffen. Auch ein CR mit mehreren folgenden Linefeeds wäre denkbar (\r\n\n\n).

Und innerhalb von enthaltenen Texten können dann auch noch welche vorkommen, die aber ggf. nicht mit ausgewertet und dann auch nicht ersetzt werden sollen.

Dann muss man eine verlässliche Methode haben, solche "Fremdabschnitte" zu erkennen, etwa eindeutige Begrenzungszeichen für Stringkonstanten (Anführungszeichen).

So long,
 Martin

--
Es existiert kein Weg, "für" etwas zu optimieren, sondern nur gegen alles andere.
  (Cheatah)
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(