Os navegadores enviam “\ r \ n” ou “\ n” ou depende do navegador?

102

Essa questão me incomoda há um milhão de anos ... sempre que crio um site com uma área de texto que permite várias linhas (como uma "Biografia" para o perfil de um usuário), sempre acabo escrevendo o seguinte código paranóico:

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

Então, o que os navegadores enviam para um <textarea name="Bio"></textarea>se ele tiver várias linhas?

Timothy Khouri
fonte
Nossa, achei que era uma pergunta estranha que não ia chamar a atenção ... mas 16 votos em 1 hora, uma loucura.
Timothy Khouri
Pensando nisso, nunca me deparei com um problema relacionado a isso. Se alguém inserir uma nova linha, ela será mostrada como uma nova linha, em todos os sistemas operacionais, nos clientes MySQL, nos navegadores, etc. Parece que isso implica que a maioria dos softwares tem uma abordagem um tanto consistente sobre o assunto. Claro, se vou fazer algo importante com isso, sempre normalizo.
Halil Özgür
O problema surgiria se eu confiasse em "\ r \ n" e, em seguida, estivesse construindo uma versão "formatada em HTML" da biografia do usuário, e como nunca encontrei um "\ r \ n", agrupo tudo em uma <p>tag.
Timothy Khouri

Respostas:

50

As especificações HTTP e MIME especificam que as linhas de cabeçalho devem terminar com \ r \ n, mas não são claras (alguns diriam que não é claro se forem claras) sobre o que fazer com o conteúdo de uma TEXTAREA. (Veja, por exemplo, este tópico de um grupo de trabalho de HTML sobre o assunto.)

Aqui está uma citação da especificação HTTP / 1.1 sobre cabeçalhos de mensagens:

O terminador de linha para campos de cabeçalho de mensagem é a sequência CRLF. No entanto, recomendamos que os aplicativos, ao analisar esses cabeçalhos, reconheçam um único LF como um terminador de linha e ignorem o CR inicial.

Acho que é uma boa estratégia em geral: seja rigoroso com o que você produz, mas liberal no que você aceita. Você deve assumir que receberá todos os tipos de terminadores de linha. (Observe que, além de CRLF e LF, o Mac OS-9 usava CR sozinho e ainda existem alguns por aí. O padrão Unicode (seção 5.8) especifica uma ampla gama de sequências de caracteres que devem ser reconhecidas como terminadores de linha; há uma lista deles aqui .)

Ted Hopp
fonte
6
Não acredito que as especificações especifiquem o que uma textarea produz.
Mark Thomas
2
@Will: Leia a pergunta original novamente. Ele pergunta especificamente sobre como os navegadores codificam o conteúdo de um textarea(que é algo que a especificação, ou pelo menos a seção citada de Ted, não restringe).
John Bartholomew
2
@Mark - você está certo. Existem debates intermináveis ​​sobre esse problema em vários fóruns. (Veja este tópico de 1995 de um grupo de trabalho de HTML.
Ted Hopp
2
Esta resposta precisa ser editada. Ele começa citando a especificação HTTP, mas isso não pertence a textareas.
DuckMaestro
2
Eu fiz, mas a resposta ainda começa citando HTTP, que é a especificação errada para enfatizar se for mencionado. Sua cotação incluída endereça especificamente "campos de cabeçalho de mensagem", mas os textareas não são enviados como campos de cabeçalho de mensagem. textareas são codificados no corpo da mensagem, que é diferente.
DuckMaestro
30

o que os navegadores enviam para um <textarea></textarea>se ele tiver várias linhas?

Todos os navegadores modernos enviam CRLF (\r\n ). No entanto, isso não é algo que foi padronizado de forma satisfatória, então eu definitivamente consideraria que vale a pena normalizar as novas linhas de todos os textos de entrada de várias linhas.

Quando o valor é lido por meio de JavaScript em vez de ser enviado diretamente de um formulário, o comportamento do navegador difere. O IE e o Opera retornam strings com CRLFs; Firefox e WebKit retornam LF. Portanto, qualquer formulário enviado com a ajuda de JavaScript / XMLHttpRequest provavelmente virá em qualquer um dos formatos.

bobince
fonte
O JavaScript se comporta de maneira consistente em qualquer navegador específico entre as plataformas? (Por exemplo, o Firefox retorna strings com LF em Windows, Macs e plataformas móveis?)
Ted Hopp
1
@Ted: Este comportamento é consistente em todas as plataformas Firefox, Opera e WebKit. IE5 / Mac eu não testei, já que está morto há muito tempo, mas esse navegador tem muitas diferenças para IE5 / Win.
bobince