Les navigateurs envoient-ils «\ r \ n» ou «\ n» ou cela dépend-il du navigateur?

102

Cette question me dérange depuis un million d'années ... chaque fois que je crée un site Web avec une zone de texte qui autorise le multi-lignes (comme une "Bio" pour le profil d'un utilisateur) je finis toujours par écrire le code paranoïaque suivant:

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

Alors, qu'est-ce que les navigateurs envoient pour un <textarea name="Bio"></textarea>s'il a plusieurs lignes?

Timothy Khouri
la source
Wow, je pensais que c'était une question étrange qui n'allait pas attirer l'attention ... mais 16 votes en 1 heure, de la folie.
Timothy Khouri
En y réfléchissant, je n'ai jamais rencontré de problème lié à cela. Si quelqu'un entre une nouvelle ligne, elle est affichée comme une nouvelle ligne, dans tous les OS, dans les clients MySQL, dans les navigateurs, etc. On dirait que cela implique que la plupart des logiciels ont une vision assez cohérente de la question. Bien sûr, si je veux en faire quelque chose d'important, je normalise toujours.
Halil Özgür
Le problème se poserait si je comptais sur "\ r \ n", puis que je construisais une version "au format HTML" de la biographie de l'utilisateur, et comme je ne rencontre jamais un "\ r \ n", je mets tout cela en un une <p>balise.
Timothy Khouri

Réponses:

50

Les spécifications HTTP et MIME spécifient que les lignes d'en-tête doivent se terminer par \ r \ n, mais elles ne sont pas claires (certains diront que ce n'est pas clair si elles sont claires) sur ce qu'il faut faire avec le contenu d'un TEXTAREA. (Voir, par exemple, ce fil de discussion d'un groupe de travail HTML sur le problème.)

Voici une citation de la spécification HTTP / 1.1 sur les en-têtes de message:

Le terminateur de ligne pour les champs d'en-tête de message est la séquence CRLF. Cependant, nous recommandons aux applications, lors de l'analyse de ces en-têtes, de reconnaître un seul LF comme terminateur de ligne et d'ignorer le CR principal.

Je pense que c'est une bonne stratégie en général: soyez strict sur ce que vous produisez mais libéral dans ce que vous acceptez. Vous devez supposer que vous recevrez toutes sortes de terminateurs de ligne. (Notez qu'en plus de CRLF et LF, Mac OS-9 utilisait CR seul, et il y en a encore quelques-uns autour. La norme Unicode (section 5.8) spécifie une large gamme de séquences de caractères qui devraient être reconnues comme des terminateurs de ligne; il y en a une liste ici .)

Ted Hopp
la source
6
Je ne pense pas que les spécifications spécifient ce que produit un textarea.
Mark Thomas
2
@Will: Relisez la question d'origine. Il demande spécifiquement comment les navigateurs encodent le contenu de a textarea(qui est quelque chose que la spécification, ou au moins la section citée par Ted, ne contraint pas).
John Bartholomew
2
@Mark - vous avez raison. Il y a des débats interminables sur ce problème dans divers forums. (Voir ce fil de discussion de 1995 d'un groupe de travail HTML.
Ted Hopp
2
Cette réponse doit être modifiée. Il commence par citer la spécification HTTP mais cela ne concerne pas les zones de texte.
DuckMaestro
2
Je l'ai fait, mais la réponse commence toujours par citer HTTP, qui est la mauvaise spécification à souligner si elle est mentionnée du tout. Votre devis inclus traite spécifiquement des "champs d'en-tête de message" mais textareane sont pas envoyés comme champs d'en-tête de message. textareas sont encodés dans le corps du message, ce qui est différent.
DuckMaestro
30

qu'est-ce que les navigateurs envoient pour un <textarea></textarea>s'il a plusieurs lignes?

Tous les navigateurs modernes envoient CRLF ( \r\n). Cependant, ce n'est pas quelque chose qui a été normalisé de manière satisfaisante, donc je considérerais certainement qu'il vaut la peine de normaliser les nouvelles lignes de tout le texte d'entrée multiligne.

Lorsque la valeur est lue via JavaScript plutôt que soumise directement à partir d'un formulaire, le comportement du navigateur diffère. IE et Opera retournent des chaînes avec des CRLF dans; Firefox et WebKit renvoient LF. Ainsi, tout formulaire soumis avec l'aide de JavaScript / XMLHttpRequest est susceptible de se présenter sous l'une ou l'autre forme.

bobince
la source
JavaScript se comporte-t-il de manière cohérente sur un navigateur particulier sur toutes les plates-formes? (Par exemple, Firefox renvoie-t-il des chaînes avec LF sur Windows, Mac et plates-formes mobiles?)
Ted Hopp
1
@Ted: Ce comportement est cohérent sur toutes les plates-formes sur Firefox, Opera et WebKit. IE5 / Mac Je n'ai pas testé, car il est mort depuis longtemps, mais ce navigateur présente de nombreuses différences par rapport à IE5 / Win.
bobince le