Браузеры отправляют «\ r \ n» или «\ n» или это зависит от браузера?

102

Этот вопрос беспокоил меня миллион лет ... всякий раз, когда я создаю веб-сайт с текстовым полем, допускающим многострочность (например, "Биография" для профиля пользователя), я всегда пишу следующий параноидальный код:

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

Итак, что браузеры отправляют для a, <textarea name="Bio"></textarea>если у него несколько строк?

Тимоти Хоури
источник
Вау, я подумал, что это странный вопрос, который не собирался привлекать внимание ... но 16 голосов за 1 час - безумие.
Timothy Khouri
Размышляя об этом, я никогда не сталкивался с проблемой, связанной с этим. Если кто-то вводит новую строку, она отображается как новая строка во всех ОС, в клиентах MySQL, в браузерах и т. Д. Похоже, это означает, что большая часть программного обеспечения имеет в некоторой степени последовательный подход к этому вопросу. Конечно, если я собираюсь сделать с этим что-то важное, я всегда нормализую.
Halil Özgür
Проблема возникла бы, если бы я полагался на "\ r \ n", а затем создавал "HTML-отформатированную" версию биографии пользователя, и, поскольку я никогда не сталкивался с "\ r \ n", я все это смешиваю один <p>тег.
Timothy Khouri

Ответы:

50

В спецификациях HTTP и MIME указано, что строки заголовков должны заканчиваться на \ r \ n, но они неясны (некоторые утверждают, что неясно, ясны ли они) относительно того, что делать с содержимым ТЕКСТАРА. (См., Например, эту ветку рабочей группы HTML по этой проблеме.)

Вот цитата из спецификации HTTP / 1.1 о заголовках сообщений:

Знак конца строки для полей заголовка сообщения - это последовательность CRLF. Тем не менее, мы рекомендуем, чтобы приложения при синтаксическом анализе таких заголовков распознавали одиночный LF как признак конца строки и игнорировали начальный CR.

Я думаю, что это хорошая стратегия в целом: строго относиться к тому, что вы производите, но либерально относиться к тому, что вы принимаете. Вы должны предполагать, что вы получите всякие терминаторы строк. (Обратите внимание, что в дополнение к CRLF и LF, Mac OS-9 использовала только CR, и есть еще несколько таких. Стандарт Unicode (раздел 5.8) определяет широкий диапазон последовательностей символов, которые должны распознаваться как символы конца строки; есть их список здесь .)

Тед Хопп
источник
6
Я не верю, что спецификации указывают, что производит текстовое поле.
Марк Томас
2
@Will: Прочтите исходный вопрос еще раз. В частности, он спрашивает, как браузеры кодируют содержимое a textarea(что не ограничивается спецификацией или, по крайней мере, цитируемым разделом Теда).
John Bartholomew
2
@Mark - ты прав. Об этой проблеме ведутся бесконечные дискуссии на различных форумах. (См. Эту ветку из 1995 года от рабочей группы HTML.
Тед Хопп,
2
Этот ответ необходимо отредактировать. Он начинается с цитирования спецификации HTTP, но это не относится к текстовым областям.
DuckMaestro
2
Я сделал это, но ответ по-прежнему начинается с ссылки на HTTP, что является неправильной спецификацией, чтобы подчеркивать, если упоминается вообще. Ваша включенная цитата специально адресована «полям заголовка сообщения», но textareaне отправляются как поля заголовка сообщения. textareas кодируются в тело сообщения, которое отличается.
DuckMaestro
30

что браузеры отправляют за a, <textarea></textarea>если в нем несколько строк?

Все современные браузеры отправляют CRLF ( \r\n). Однако это не то, что было должным образом стандартизовано, поэтому я определенно считаю целесообразным нормализовать символы новой строки всего многострочного входного текста.

Когда значение считывается через JavaScript, а не отправляется непосредственно из формы, поведение браузера отличается. IE и Opera возвращают строки с CRLF в; Firefox и WebKit возвращают LF. Таким образом, любая форма, отправляемая с помощью JavaScript / XMLHttpRequest, скорее всего, будет иметь любую форму.

бобинс
источник
Последовательно ли ведет себя JavaScript в каком-либо конкретном браузере на разных платформах? (Например, возвращает ли Firefox строки с LF на Windows, Mac и мобильных платформах?)
Тед Хопп,
1
@Ted: Это поведение одинаково для всех платформ Firefox, Opera и WebKit. IE5 / Mac я не тестировал, так как он давно умер, но этот браузер имеет много отличий от IE5 / Win.
bobince