¿Los navegadores envían "\ r \ n" o "\ n" o depende del navegador?

102

Esta pregunta me ha molestado durante un millón de años ... cada vez que creo un sitio web con un área de texto que permite varias líneas (como una "Bio" para el perfil de un usuario) siempre termino escribiendo el siguiente código paranoico:

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

Entonces, ¿qué envían los navegadores para un <textarea name="Bio"></textarea>si tiene varias líneas?

Timothy Khouri
fuente
Vaya, pensé que esta era una pregunta extraña que no iba a llamar la atención ... pero 16 votos en 1 hora, una locura.
Timothy Khouri
Pensando en ello, nunca me he encontrado con un problema relacionado con esto. Si alguien ingresa a una nueva línea, se muestra como una nueva línea, en todos los sistemas operativos, en los clientes MySQL, en los navegadores, etc. Parece que esto implica que la mayoría del software tiene una visión un tanto coherente del asunto. Por supuesto, si voy a hacer algo importante con él, siempre lo normalizo.
Halil Özgür
El problema surgiría si confiara en "\ r \ n", y luego estuviera construyendo una versión "con formato HTML" de la biografía del usuario, y como nunca me encuentro con una "\ r \ n", lo agrupo todo en una <p>etiqueta.
Timothy Khouri

Respuestas:

50

Las especificaciones HTTP y MIME especifican que las líneas de encabezado deben terminar con \ r \ n, pero no son claras (algunos argumentarían que no está claro si son claras) sobre qué hacer con el contenido de un TEXTAREA. (Vea, por ejemplo, este hilo de un grupo de trabajo HTML sobre el tema).

Aquí hay una cita de la especificación HTTP / 1.1 sobre los encabezados de los mensajes:

El terminador de línea para los campos de encabezado de mensaje es la secuencia CRLF. Sin embargo, recomendamos que las aplicaciones, al analizar dichos encabezados, reconozcan un solo LF como terminador de línea e ignoren el CR inicial.

Creo que es una buena estrategia en general: sea estricto con lo que produce pero liberal en lo que acepta. Debe asumir que recibirá todo tipo de terminadores de línea. (Tenga en cuenta que, además de CRLF y LF, Mac OS-9 usaba CR solo, y todavía hay algunos. El estándar Unicode (sección 5.8) especifica una amplia gama de secuencias de caracteres que deben reconocerse como terminadores de línea; hay una lista de ellos aquí .)

Ted Hopp
fuente
6
No creo que las especificaciones especifiquen lo que produce un área de texto.
Mark Thomas
2
@Will: Lea la pregunta original nuevamente. Específicamente pregunta sobre cómo los navegadores codifican el contenido de un textarea(que es algo que la especificación, o al menos la sección citada de Ted, no restringe).
John Bartholomew
2
@ Mark, tienes razón. Hay un sinfín de debates sobre ese problema en varios foros. (Vea este hilo de 1995 de un grupo de trabajo HTML.
Ted Hopp
2
Esta respuesta debe editarse. Comienza citando la especificación HTTP, pero eso no se aplica a las áreas de texto.
DuckMaestro
2
Lo hice, pero la respuesta aún comienza citando HTTP, que es la especificación incorrecta para enfatizar si se menciona. La cotización incluida se refiere específicamente a los "campos de encabezado de mensaje", pero textarealos correos electrónicos no se envían como campos de encabezado de mensaje. textareas se codifican en el cuerpo del mensaje que es diferente.
DuckMaestro
30

¿Qué envían los navegadores para un <textarea></textarea>si tiene varias líneas?

Todos los navegadores modernos envían CRLF ( \r\n). Sin embargo, esto no es algo que se haya estandarizado satisfactoriamente, por lo que definitivamente consideraría que vale la pena normalizar las nuevas líneas de todo el texto de entrada de varias líneas.

Cuando el valor se lee a través de JavaScript en lugar de enviarse directamente desde un formulario, el comportamiento del navegador es diferente. IE y Opera devuelven cadenas con CRLF en; Firefox y WebKit devuelven LF. Por lo tanto, es probable que cualquier formulario que se envíe con la ayuda de JavaScript / XMLHttpRequest venga en cualquier formulario.

bobince
fuente
¿JavaScript se comporta de forma coherente en cualquier navegador en particular en todas las plataformas? (Por ejemplo, ¿Firefox devuelve cadenas con LF en Windows, Mac y plataformas móviles?)
Ted Hopp
1
@Ted: este comportamiento es coherente en todas las plataformas de Firefox, Opera y WebKit. IE5 / Mac No lo he probado, ya que hace mucho tiempo que murió, pero ese navegador tiene muchas diferencias con IE5 / Win.
Bobince