Браузеры отправляют "\ r \ n" или "\ n" или это зависит от браузера? - PullRequest
98 голосов
/ 12 июня 2011

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

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

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

Ответы [ 2 ]

47 голосов
/ 12 июня 2011

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

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

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

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

29 голосов
/ 13 июня 2011

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

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

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

...