Quel caractère représente une nouvelle ligne dans une zone de texte


87

Juste un rapide, mais je veux m'assurer que j'attrape les variations multiplateformes.

J'aime convertir les nouvelles lignes entrées dans une zone de texte en une [virgule], afin que la sortie puisse être représentée sur une seule ligne, ma question ...

Actuellement, en envoyant à partir de Google Chrome, lorsque je regarde la valeur, je trouve qu'il utilise \r\npour les nouvelles lignes. Si je remplace, \r\nje sais que cela fonctionnera pour Chrome sur Windows 7, mais qu'en est-il des autres plates-formes, y a-t-il des variations sur ce que les autres navigateurs vont insérer comme nouvelle ligne dans une zone de texte?


3
pour simplifier: tous les navigateurs n'envoient-ils jamais que '\ r \ n' pour représenter une nouvelle ligne entrée dans une zone de texte (je ne crée pas la valeur par programme, elle n'est créée que par l'utilisateur dans son navigateur)
Ninjanoel

Réponses:


105

Selon les spécifications HTML, les navigateurs sont tenus de canoniser les sauts de ligne dans l'entrée utilisateur dans CR LF ( \r\n), et je ne pense pas qu'un navigateur se trompe. Référence: clause 17.13.4 Types de contenu de formulaire dans la spécification HTML 4.01.

Dans les brouillons HTML5, la situation est plus compliquée, car ils traitent également des processus à l'intérieur d'un navigateur, pas seulement des données qui sont envoyées à un gestionnaire de formulaire côté serveur lorsque le formulaire est soumis. Selon eux (et la pratique du navigateur), la textareavaleur de l' élément existe en trois variantes:

  1. la valeur brute saisie par l'utilisateur, non normalisée; il peut contenir une paire CR, LF ou CR LF;
  2. la valeur interne, appelée «valeur API», où les sauts de ligne sont normalisés à LF (uniquement);
  3. la valeur de soumission, où les sauts de ligne sont normalisés en paires CR LF, conformément aux conventions Internet.

4
HTML 5 spec: 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

Merci, tu as fait ma journée! J'étais juste confus parce que quand j'envoie du contenu depuis textarea sur osx / chrome, le navigateur l'envoie avec CR LF ..
starikovs

3
Une autre question est de savoir pourquoi lorsque vous obtenez ".length" de textarea, il compte CR LF comme un seul caractère, mais lorsque vous vérifiez côté serveur (par exemple, avec PHP strlen), ce sera deux caractères ...
starikovs

2
Le lien de @ ComFreek ci-dessus est rompu aujourd'hui, utilisez: w3.org/TR/html5/forms.html#the-textarea-element
Glen Mazza

@starikovs, je suppose que cela a été répondu avec la valeur interne, appelée «valeur API», où les sauts de ligne sont normalisés à LF (uniquement); partie. Ce que vous voyez comme un caractère (à savoir \n), est probablement ce qui est fourni par «l'API interne». Aucune référence, c'est juste ma base de supposition sur le bon sens.
user907860

12

Parler spécifiquement des zones de texte dans les formulaires Web, pour toutes les zones de texte, sur toutes les plates-formes, \r\nfonctionnera.

Si vous utilisez autre chose, vous causerez des problèmes de copier-coller sur les plates-formes Windows.

Les sauts de ligne seront canonisés par les navigateurs Windows lorsque le formulaire est soumis, mais si vous envoyez le formulaire au navigateur avec des \nsauts de ligne, vous constaterez que le texte ne sera pas copié et collé correctement entre, par exemple, le bloc-notes et la zone de texte.

Fait intéressant, malgré la convention de fin de ligne Unix \n, la norme dans la plupart des protocoles réseau basés sur du texte, y compris HTTP, SMTP, POP3, IMAP, et ainsi de suite est toujours \r\n. Oui, cela n'a peut-être pas beaucoup de sens, mais c'est l'histoire et l'évolution des normes pour vous!


6

Il semble que, selon la spécification HTML5 , la propriété value de l'élément textarea devrait renvoyer '\ r \ n' pour une nouvelle ligne:

La valeur de l'élément est définie comme étant la valeur brute de l'élément avec la transformation suivante appliquée:

Remplacez chaque occurrence d'un caractère «CR» (U + 000D) non suivi d'un caractère «LF» (U + 000A), et chaque occurrence d'un caractère «LF» (U + 000A) non précédée d'un «CR» ( U + 000D), par une chaîne de deux caractères constituée d'une paire de caractères U + 000D CARRIAGE RETURN "CRLF" (U + 000A).

Suivre le lien vers "valeur" indique clairement qu'il fait référence à la propriété value accessible en javascript:

Les contrôles de formulaire ont une valeur et une vérification. (Ce dernier n'est utilisé que par les éléments d'entrée.) Ils sont utilisés pour décrire comment l'utilisateur interagit avec le contrôle.

Cependant, dans les cinq principaux navigateurs (sous Windows, 27/11/2015), si '\ r \ n' est écrit dans une zone de texte, le '\ r' est supprimé. (Pour tester: var e = document.createElement ('textarea'); e.value = '\ r \ n'; alert (e.value == '\ n');) Ceci est vrai pour IE depuis la v9. Avant cela, IE retournait '\ r \ n' et convertissait à la fois '\ r' et '\ n' en '\ r \ n' (qui est la spécification HTML5). Alors ... je suis confus.

Pour être sûr, il suffit généralement d'utiliser '\ r? \ N' dans les expressions régulières au lieu de simplement '\ n', mais si la séquence de retour à la ligne doit être connue, un test comme celui ci-dessus peut être effectué dans l'application.


Sur la même page, la valeur obtenue via JS n'est-elle pas appelée valeur API?
Anshul

@Anshul - Je vois ce que tu veux dire. La question initiale était "Actuellement, envoi depuis google chrome, lorsque je regarde la valeur, je trouve qu'elle utilise \ r \ n pour les nouvelles lignes ..." Donc, comme elle est "envoyée", je suppose que la valeur est en cours de lecture le serveur. J'ai supposé que c'était avec JS. Quoi qu'il en soit, j'espère que les faits que j'ai publiés sont d'une certaine utilité. Merci pour votre commentaire.
barncat

@brancat, je pense que la langue du serveur ne devrait pas avoir d'importance ici. La spécification HTML5 est très claire sur 2 choses pour un textarea. 1. Le corps de la requête n'aura que \ r \ n 2. La valeur JS n'aura que \ n que vous utilisiez \ r, \ r \ n ou \ n lors de la saisie. Cela correspond également à votre découverte avec IE9 +.
Anshul

5

- Line Feed and 
 Carriage Return

Ces entités HTML inséreront une nouvelle ligne ou un retour chariot dans une zone de texte.


11
ne répond pas vraiment à la question
cherouvim

2
@cherouvim, je ne comprends pas pourquoi vous avez voté sur cette réponse? Avez-vous lu la question ci-dessus? S'il vous plaît, ne donnez pas de réponse erronée au commentaire sans rien comprendre!
Mahbub

3
@Mahbub: Cette réponse a actuellement 3 votes négatifs car elle ne répond pas à la question.
cherouvim

Ne répond pas à la question.
Mike Devenney

1
Eh bien, je cherchais quoi & # 13; signifiait et cette réponse m'a aidé, alors ne vous sentez pas mal, toutes les informations sont de bonnes informations et aident les gens à des moments aléatoires :)
jackrabbithanna
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.