Senden Browser "\ r \ n" oder "\ n" oder hängt es vom Browser ab?

102

Diese Frage beschäftigt mich seit einer Million Jahren ... Wenn ich eine Website mit einem Textbereich erstelle, der mehrzeilig ist (z. B. eine "Bio" für ein Benutzerprofil), schreibe ich am Ende immer den folgenden paranoiden Code:

// C# code sample...
bio = bio.Replace("\r\n", "\n").Replace("\r", "\n");
bio = Regex.Replace(@"\n{2,}", "\n\n");

Also, was senden Browser für ein, <textarea name="Bio"></textarea>wenn es mehrere Zeilen hat?

Timothy Khouri
quelle
Wow, ich dachte, das wäre eine seltsame Frage, die keine Aufmerksamkeit erregen würde ... aber 16 Stimmen in 1 Stunde, Verrücktheit.
Timothy Khouri
Wenn ich darüber nachdenke, bin ich nie auf ein Problem gestoßen, das damit zusammenhängt. Wenn jemand eine neue Zeile eingibt, wird diese in allen Betriebssystemen, in MySQL-Clients, in Browsern usw. als neue Zeile angezeigt. Dies impliziert, dass die meisten Programme eine etwas konsistente Sichtweise auf die Angelegenheit haben. Natürlich normalisiere ich mich immer, wenn ich etwas Wichtiges damit machen will.
Halil Özgür
Das Problem würde auftreten, wenn ich mich auf "\ r \ n" verlassen und dann eine "HTML-formatierte" Version der Bio des Benutzers erstellen würde. Da ich nie auf ein "\ r \ n" stoße, fasse ich alles zusammen ein <p>Tag.
Timothy Khouri

Antworten:

50

Die HTTP- und MIME- Spezifikationen geben an, dass Kopfzeilen mit \ r \ n enden müssen, aber sie sind nicht klar (einige würden argumentieren, dass es nicht klar ist, ob sie klar sind), was mit dem Inhalt einer TEXTAREA zu tun ist. (Siehe zum Beispiel diesen Thread einer HTML-Arbeitsgruppe zu diesem Problem.)

Hier ist ein Zitat aus der HTTP / 1.1-Spezifikation zu Nachrichtenkopfzeilen:

Der Zeilenabschluss für Nachrichtenkopffelder ist die Sequenz CRLF. Wir empfehlen jedoch, dass Anwendungen beim Parsen solcher Header einen einzelnen LF als Zeilenabschluss erkennen und den führenden CR ignorieren.

Ich denke, das ist im Allgemeinen eine gute Strategie: Seien Sie streng in Bezug auf das, was Sie produzieren, aber liberal in Bezug auf das, was Sie akzeptieren. Sie sollten davon ausgehen, dass Sie alle Arten von Leitungsterminatoren erhalten. (Beachten Sie, dass Mac OS-9 neben CRLF und LF nur CR verwendet hat und es noch einige davon gibt. Der Unicode-Standard (Abschnitt 5.8) legt eine Vielzahl von Zeichenfolgen fest, die als Zeilenabschluss erkannt werden sollten. es gibt eine Liste von ihnen hier .)

Ted Hopp
quelle
6
Ich glaube nicht, dass die Spezifikationen angeben, was ein Textbereich produziert.
Mark Thomas
2
@ Will: Lies die ursprüngliche Frage noch einmal. Es wird speziell gefragt, wie Browser den Inhalt von a codieren textarea(was durch die Spezifikation oder zumindest Teds zitierten Abschnitt nicht eingeschränkt wird).
John Bartholomew
2
@ Mark - du hast recht. Es gibt endlose Debatten über dieses Problem in verschiedenen Foren. (Siehe diesen Thread von 1995 aus einer HTML-Arbeitsgruppe.
Ted Hopp
2
Diese Antwort muss bearbeitet werden. Zunächst wird die HTTP-Spezifikation zitiert, die sich jedoch nicht auf Textbereiche bezieht.
DuckMaestro
2
Ich habe es getan, aber die Antwort beginnt immer noch mit dem Zitieren von HTTP, was die falsche Spezifikation ist, wenn überhaupt erwähnt. Ihr beigefügtes Angebot befasst sich speziell mit "Nachrichtenkopffeldern", aber textareas werden nicht als Nachrichtenkopffelder gesendet. textareas werden in den Nachrichtentext codiert, der anders ist.
DuckMaestro
30

Was senden Browser für ein, <textarea></textarea>wenn es mehrere Zeilen hat?

Alle modernen Browser senden CRLF ( \r\n). Dies ist jedoch nicht zufriedenstellend standardisiert, so dass ich es auf jeden Fall für sinnvoll halte, die Zeilenumbrüche aller mehrzeiligen Eingabetexte zu normalisieren.

Wenn der Wert über JavaScript gelesen wird und nicht direkt aus einem Formular gesendet wird, unterscheidet sich das Browserverhalten. IE und Opera geben Zeichenfolgen mit CRLFs zurück. Firefox und WebKit geben LF zurück. Daher wird jedes Formular, das mit der Hilfe von JavaScript / XMLHttpRequest gesendet wird, wahrscheinlich in beiden Formen vorliegen.

Bobince
quelle
Verhält sich JavaScript in einem bestimmten Browser plattformübergreifend konsistent? (Gibt Firefox beispielsweise Zeichenfolgen mit LF auf Windows, Macs und mobilen Plattformen zurück?)
Ted Hopp
1
@Ted: Dieses Verhalten ist plattformübergreifend in Firefox, Opera und WebKit konsistent. IE5 / Mac habe ich nicht getestet, da es längst tot ist, aber dieser Browser hat viele Unterschiede zu IE5 / Win.
Bobince