I browser inviano "\ r \ n" o "\ n" o dipende dal browser?


102

Questa domanda mi ha infastidito per un milione di anni ... ogni volta che creo un sito web con un'area di testo che consente il multi-riga (come una "Bio" per il profilo di un utente) finisco sempre per scrivere il seguente codice paranoico:

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

Quindi, cosa inviano i browser per <textarea name="Bio"></textarea>se ha più righe?


Wow, ho pensato che questa fosse una domanda strana che non avrebbe attirato alcuna attenzione ... ma 16 voti in 1 ora, follia.
Timothy Khouri

A pensarci bene, non mi sono mai imbattuto in un problema relativo a questo. Se qualcuno entra in una nuova riga, viene mostrata come una nuova riga, in tutti i sistemi operativi, nei client MySQL, nei browser, ecc. Sembra che questo implichi che la maggior parte del software abbia una visione piuttosto coerente della questione. Naturalmente, se ho intenzione di fare qualcosa di importante con esso, mi normalizzo sempre.
Halil Özgür

Il problema si presentava se facessi affidamento su "\ r \ n" e poi costruissi una versione "in formato HTML" della biografia dell'utente e, poiché non ho mai incontrato un "\ r \ n", lo raggruppo tutto in un <p>tag.
Timothy Khouri

Risposte:


50

Le specifiche HTTP e MIME specificano che le righe di intestazione devono terminare con \ r \ n, ma non sono chiare (alcuni direbbero che non è chiaro se sono chiare) su cosa fare con il contenuto di un TEXTAREA. (Vedi, ad esempio, questo thread di un gruppo di lavoro HTML sul problema.)

Ecco una citazione dalle specifiche HTTP / 1.1 sulle intestazioni dei messaggi:

Il terminatore di riga per i campi di intestazione del messaggio è la sequenza CRLF. Tuttavia, si consiglia alle applicazioni, durante l'analisi di tali intestazioni, di riconoscere un singolo LF come terminatore di riga e ignorare il CR iniziale.

Penso che sia una buona strategia in generale: sii severo su ciò che produci ma liberale in ciò che accetti. Dovresti presumere che riceverai tutti i tipi di terminatori di riga. (Notare che oltre a CRLF e LF, Mac OS-9 utilizzava solo CR, e ce ne sono ancora alcuni in giro. Lo standard Unicode (sezione 5.8) specifica un'ampia gamma di sequenze di caratteri che dovrebbero essere riconosciute come terminatori di riga; ce n'è un elenco qui .)


6
Non credo che le specifiche specifichino cosa produce una textarea.
Mark Thomas

2
@ Will: leggi di nuovo la domanda originale. Chiede specificamente come i browser codificano il contenuto di un textarea(che è qualcosa che le specifiche, o almeno la sezione citata da Ted, non vincolano).
John Bartholomew

2
@Mark - hai ragione. Ci sono infiniti dibattiti su questo problema in vari forum. (Vedi questo thread del 1995 da un gruppo di lavoro HTML.
Ted Hopp

2
Questa risposta deve essere modificata. Inizia citando le specifiche HTTP ma questo non riguarda le aree di testo.
DuckMaestro

2
L'ho fatto, ma la risposta inizia ancora con la citazione di HTTP, che è la specifica sbagliata da enfatizzare se menzionata. Il preventivo incluso riguarda specificamente i "campi di intestazione del messaggio", ma textareanon vengono inviati come campi di intestazione del messaggio. textareavengono codificati nel corpo del messaggio che è diverso.
DuckMaestro

30

cosa inviano i browser per un <textarea></textarea>se ha più righe?

Tutti i browser moderni inviano CRLF ( \r\n). Tuttavia, questo non è qualcosa che è stato standardizzato in modo soddisfacente, quindi considererei sicuramente utile normalizzare le nuove righe di tutto il testo di input multilinea.

Quando il valore viene letto tramite JavaScript anziché essere inviato direttamente da un modulo, il comportamento del browser è diverso. IE e Opera restituiscono stringhe con CRLF in; Firefox e WebKit restituiscono LF. Quindi qualsiasi modulo che viene inviato con l'aiuto di JavaScript / XMLHttpRequest è probabile che arrivi in ​​entrambe le forme.


JavaScript si comporta in modo coerente su un browser particolare su piattaforme diverse? (Ad esempio, Firefox restituisce stringhe con LF su Windows, Mac e piattaforme mobili?)
Ted Hopp,

1
@Ted: questo comportamento è coerente su tutte le piattaforme su Firefox, Opera e WebKit. IE5 / Mac non l'ho testato, dato che è morto da tempo, ma quel browser ha molte differenze rispetto a IE5 / Win.
bobince
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.