Браузеры отправляют "\ 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, скорее всего, будет в любой форме.