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

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

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

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

Ответ 1

HTTP и MIME указывают, что строки заголовка должны заканчиваться символом \r\n, но они не ясны (некоторые утверждают, что неясно, насколько они понятны) о том, что делать с содержимым TEXTAREA. (См., Например, этот поток из рабочей группы HTML по проблеме.)

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

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

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

Ответ 2

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

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

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