Welches Zeichen steht für eine neue Zeile in einem Textbereich?

85

Nur eine kurze, aber ich möchte sicherstellen, dass ich plattformübergreifende Variationen abfange.

Ich konvertiere gerne neue Zeilen, die in einen Textbereich eingegeben wurden, in ein [Komma], damit die Ausgabe in einer einzelnen Zeile dargestellt werden kann, meine Frage ...

Derzeit wird beim Senden von Google Chrome beim Anzeigen des Werts festgestellt, dass er \r\nfür neue Zeilen verwendet wird. Wenn ich ersetze, \r\nweiß ich, dass es unter Windows 7 für Chrome funktioniert, aber was ist mit anderen Plattformen? Gibt es Variationen darüber, was andere Browser als neue Zeile in einen Textbereich einfügen?

Ninjanoel
quelle
3
Zur Vereinfachung: Senden alle Browser immer nur '\ r \ n', um eine neue Zeile darzustellen, die in einen Textbereich eingegeben wurde (ich erstelle den Wert nicht programmgesteuert, er wird immer nur vom Benutzer in seinem Browser erstellt)
Ninjanoel

Antworten:

103

Nach HTML-Spezifikationen müssen Browser Zeilenumbrüche bei Benutzereingaben in CR LF ( \r\n) kanonisieren , und ich glaube, kein Browser versteht dies falsch. Referenz: Abschnitt 17.13.4 Formularinhaltstypen in der HTML 4.01-Spezifikation.

In HTML5-Entwürfen ist die Situation komplizierter, da sie sich auch mit den Prozessen in einem Browser befassen, nicht nur mit den Daten, die beim Senden des Formulars an einen serverseitigen Formularhandler gesendet werden. Entsprechend ihnen (und der Browserpraxis) existiert der textareaElementwert in drei Varianten:

  1. der vom Benutzer eingegebene Rohwert, nicht normalisiert; es kann ein CR-, LF- oder CR-LF-Paar enthalten;
  2. der interne Wert, der als „API-Wert“ bezeichnet wird und bei dem Zeilenumbrüche (nur) auf LF normalisiert werden;
  3. Der Übermittlungswert, bei dem Zeilenumbrüche gemäß Internetkonventionen auf CR LF-Paare normalisiert werden.
Jukka K. Korpela
quelle
4
HTML 5-Spezifikation: w3.org/html/wg/drafts/html/CR/forms.html#the-textarea-element : the user agent should allow the user to edit, insert, and remove text, and to insert and remove line breaks in the form of "LF" (U+000A) characters.
ComFreek
Danke, du hast meinen Tag gemacht! Ich war nur verwirrt, weil der Browser beim Senden von Inhalten aus dem Textbereich auf osx / chrome diese mit CR LF sendet.
starikovs
3
Eine andere Frage ist, warum, wenn Sie ".length" von Textarea erhalten, CR LF als nur ein Zeichen gezählt wird, aber wenn Sie auf der Serverseite überprüfen (zum Beispiel mit PHP strlen), werden es zwei Zeichen sein ...
starikovs
2
@ ComFreek Link oben ist heute gebrochen, verwenden Sie: w3.org/TR/html5/forms.html#the-textarea-element
Glen Mazza
@starikovs, ich nehme an, dies wurde mit dem internen Wert "API-Wert" beantwortet, bei dem Zeilenumbrüche (nur) auf LF normalisiert werden. Teil. Was Sie als ein Zeichen sehen (nämlich \n), ist wahrscheinlich das, was von der "internen API" bereitgestellt wird. Kein Hinweis, dies ist nur meine Vermutung, die auf gesundem Menschenverstand beruht.
user907860
12

Es \r\nwird funktionieren, speziell über Textbereiche in Webformularen für alle Textbereiche auf allen Plattformen zu sprechen .

Wenn Sie etwas anderes verwenden, verursachen Sie Probleme beim Ausschneiden und Einfügen auf Windows-Plattformen.

Die Zeilenumbrüche werden von Windows-Browsern beim Senden des Formulars \nkanonisiert. Wenn Sie das Formular jedoch mit Zeilenumbrüchen an den Browser senden , werden Sie feststellen, dass der Text beispielsweise zwischen Notizblock und Textbereich nicht korrekt kopiert und eingefügt wird.

Interessanterweise ist \nder Standard in den meisten textbasierten Netzwerkprotokollen, einschließlich HTTP, SMTP, POP3, IMAP usw. , trotz der Konvention zum Ende der Unix-Leitung immer noch \r\n. Ja, es macht vielleicht nicht viel Sinn, aber das ist Geschichte und sich entwickelnde Standards für Sie!

Ben
quelle
6

Es scheint, dass gemäß der HTML5-Spezifikation die value-Eigenschaft des textarea-Elements '\ r \ n' für eine neue Zeile zurückgeben sollte:

Der Wert des Elements wird als Rohwert des Elements definiert, wobei die folgende Transformation angewendet wird:

Ersetzen Sie jedes Vorkommen eines "CR" -Zeichens (U + 000D), dem kein "LF" -Zeichen (U + 000A) folgt, und jedes Vorkommen eines "LF" -Zeichens (U + 000A), dem kein "CR" -Zeichen (U + 000A) vorangestellt ist ( U + 000D) -Zeichen durch eine zweistellige Zeichenfolge, die aus einem U + 000D CARRIAGE RETURN-Zeichenpaar "CRLF" (U + 000A) besteht.

Wenn Sie dem Link zu 'Wert' folgen, wird deutlich, dass er sich auf die Werteigenschaft bezieht, auf die in Javascript zugegriffen wird:

Formularsteuerelemente haben einen Wert und eine Überprüfbarkeit. (Letzteres wird nur von Eingabeelementen verwendet.) Diese beschreiben, wie der Benutzer mit dem Steuerelement interagiert.

Wenn jedoch in allen fünf Hauptbrowsern (unter Windows, 27.11.2015) '\ r \ n' in einen Textbereich geschrieben wird, wird das '\ r' entfernt. (Zum Testen: var e = document.createElement ('textarea'); e.value = '\ r \ n'; alert (e.value == '\ n');) Dies gilt für IE seit v9. Zuvor gab IE '\ r \ n' zurück und konvertierte sowohl '\ r' als auch '\ n' in '\ r \ n' (dies ist die HTML5-Spezifikation). Also ... ich bin verwirrt.

Um sicher zu gehen, reicht es normalerweise aus, '\ r? \ N' in regulären Ausdrücken anstelle von '\ n' zu verwenden. Wenn jedoch die Zeilenumbruchsequenz bekannt sein muss, kann ein Test wie der oben in der App durchgeführt werden.

Scheunenkatze
quelle
Wird der über JS erhaltene Wert nicht auf derselben Seite als API-Wert bezeichnet?
Anshul
@ Anshul - Ich verstehe was du meinst. Die ursprüngliche Frage lautete: "Beim Senden von Google Chrome wird beim Anzeigen des Werts derzeit \ r \ n für neue Zeilen verwendet." Da der Wert also "gesendet" wird, wird er vermutlich weitergelesen der Kellner. Ich nahm an, dass es mit JS war. Wie auch immer, hoffentlich sind die Fakten, die ich gepostet habe, von Nutzen. Vielen Dank für Ihren Kommentar.
Barncat
@brancat, ich denke die Serversprache sollte hier keine Rolle spielen. Die HTML5-Spezifikation ist in Bezug auf zwei Dinge für a sehr klar textarea. 1. Der Anforderungshauptteil hat nur \ r \ n 2. Der JS-Wert hat nur \ n, unabhängig davon, ob Sie während der Eingabe \ r, \ r \ n oder \ n verwenden. Es entspricht auch Ihrem Befund mit IE9 +.
Anshul
5

- Line Feed and 
 Carriage Return

Diese HTML-Entitäten fügen eine neue Zeile oder einen neuen Zeilenumbruch in einen Textbereich ein.

Damodar Das
quelle
11
beantwortet die Frage nicht wirklich
Cherouvim
2
@cherouvim, ich kann nicht verstehen, warum Sie diese Antwort abgelehnt haben? Hast du die Frage oben gelesen? Bitte geben Sie keine fehlerhafte Antwort auf einen Kommentar, ohne etwas zu verstehen!
Mahbub
3
@ Mahbub: Diese Antwort hat derzeit 3 ​​Downvotes, da sie die Frage nicht beantwortet.
Cherouvim
Beantwortet keine Frage.
Mike Devenney
1
Nun, ich habe gesucht, was & # 13; gemeint und diese Antwort hat mir geholfen, also fühle dich nicht schlecht, alle Informationen sind gute Informationen und helfen Leuten zu zufälligen Zeiten :)
Jackrabbithanna