web-dev-qa-db-fra.com

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

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 plusieurs lignes (comme un "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?

100
Timothy Khouri

Les spécifications HTTP et MIME spécifient que les lignes d'en-tête doivent se terminer par\r\n , mais ils ne sont pas clairs (certains diront que ce n'est pas clair s'ils le sont) sur ce qu'il faut faire avec le contenu d'un TEXTAREA. (Voir, par exemple, ce fil 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 que les applications, lors de l'analyse de ces en-têtes, reconnaissent un seul LF comme terminateur de ligne et ignorent le CR principal).

Je pense que c'est une bonne stratégie en général: être 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 a utilisé CR seul, et il y en a encore quelques-uns autour. Le norme Unicode (section 5.8) spécifie un large éventail de séquences de caractères qui devrait être reconnu comme terminateur de ligne; il y en a une liste ici .)

48
Ted Hopp

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 multi-lignes.

Lorsque la valeur est lue via JavaScript plutôt que d'être envoyée directement à partir d'un formulaire, le comportement du navigateur diffère. IE et Opera retourne des chaînes avec CRLF dans; Firefox et WebKit renvoient LF. Ainsi, tout formulaire qui est soumis avec JavaScript/XMLHttpRequest help est susceptible d'entrer dans l'un ou l'autre forme.

29
bobince