Sven Rautenberg: Ascii-Werte von \n\r

Beitrag lesen

Moin!

Also, \LF entspricht nicht unbedingt \n

"Nicht unbedingt" - das ist der Knackpunkt.

Wenn man Quellen zu diesem Thema zusammenträgt, muß man zu folgender Erkenntnis kommen:

Irgendein Subsystem haut irgendwie immer dazwischen und "versaut es". Wenn die Programmiersprache selbst (so wie PHP) eindeutige Definitionen für \n und \r hat, so kann dennoch beim Schreiben in Dateien irgendein ASCII-Modus eine Anpassung von "\n"==="LF" hin zu "\n"=>"CRLF" (o.ä.) und umgekehrt bei Lesen eine Konvertierung von "CRLF" hin zu "LF"==="\n" vornehmen. Das bedeutet: In der Datei steht CRLF, innerhalb der Sprache sieht man aber nur "\n" bzw. LF.

Szenario 1: Testet man z.B. mit PHP unter Windows im ASCII-Dateimodus (der beim Schreiben eine Wandlung von LF in CRLF vornimmt) und nutzt nur "\n", transferiert dann die Datendatei im ASCII-FTP-Modus (der ebenfalls eine Zeilenendwandlung vornimmt, beim Upload von Windows zu Unix von CRLR hin zu LF) auf einen Unix-Server und testet dort erneut, merkt man nichts. Unix kennt zwar keinen ASCII-Dateimodus, aber da die Zeilenenden durch den FTP-Transfer gewandelt wurden, paßt dem Skript alles.

Szenario 2: Nutzt man stattdessen durchgehend binäre Datei- und Transfermodi, wird aus "\n" unter Windows nur ein LF in die Datei geschrieben, beim binären FTP-Transfer bleibt das LF erhalten, und beim binären Lesen unter Unix ebenfalls. Also paßt auch alles.

Szenario 3: Nur wenn man ASCII und Binär nicht durchgehend beibehält, gibts Murks - beispielsweise, wenn man die Datei mit PHP im ASCII-Modus schreibt und liest, aber im Binärmodus mit FTP hochlädt.

Szenario 4: Wenn man umgekehrt einfach erwartet, dass Dateien eine beliebige Form des Zeilenumbruchs enthalten könnte (CR/LF/CRLF), kann einem irgendeine unerwartete Veränderung, die externe Programme, FTP-Transfers etc. am Zeilenumbruch vornehmen, hingegen ziemlich egal sein.

Aber deutlich festzuhalten ist in meinen Augen: Jede Programmiersprache setzt "\n" in der internen Stringbehandlung erstmal immer nur in ein Linefeed um (behaupte ich jetzt einfach mal: stringlength("\n")==1 && ASCII("\n")==10). Die Wandlung in plattformabhängige Zeilenenden geschieht abhängig von entsprechenden I/O-Subsystemen - oder eben auch nicht. Und das kann einem, je nach Szenario, vollkommen egal sein - oder eben auch nicht.

- Sven Rautenberg

--
"Love your nation - respect the others."