Какой символ представляет новую строку в текстовой области


88

Просто быстрый, но хочу убедиться, что ловлю кроссплатформенные варианты.

Мне нравится преобразовывать новые строки, введенные в текстовую область, в [запятую], чтобы вывод можно было представить в одной строке, мой вопрос ...

В настоящее время при отправке из Google Chrome, когда я просматриваю значение, я обнаруживаю, что оно используется \r\nдля новых строк. Если я заменю, \r\nя знаю, что он будет работать для Chrome на Windows 7, но как насчет других платформ, есть ли варианты того, что другие браузеры будут вставлять как новую строку в текстовую область?


3
для упрощения: все ли браузеры когда-либо отправляют '\ r \ n' только для представления новой строки, введенной в текстовую область (я не создаю значение программно, оно создается только когда-либо пользователем в их браузере)
Ниндзяноэль

Ответы:


105

Согласно спецификациям HTML, браузеры должны канонизировать разрывы строк при вводе пользователем в CR LF ( \r\n), и я не думаю, что какой-либо браузер ошибается. Ссылка: пункт 17.13.4 Типы содержимого форм в спецификации HTML 4.01.

В черновиках HTML5 ситуация более сложная, поскольку они также имеют дело с процессами внутри браузера, а не только с данными, которые отправляются обработчику формы на стороне сервера при отправке формы. Согласно им (и практике браузера) textareaзначение элемента существует в трех вариантах:

  1. исходное значение, введенное пользователем, ненормализованное; он может содержать пару CR, LF или CR LF;
  2. внутреннее значение, называемое «значением API», где разрывы строк нормализуются до LF (только);
  3. значение отправки, где разрывы строк нормализованы к парам CR LF в соответствии с соглашениями в Интернете.

4
HTML 5 спецификации: w3.org/html/wg/drafts/html/CR/forms.html#the-textarea-element : the user agent should allow the user to edit, insert, and remove text, and to insert and remove line breaks in the form of "LF" (U+000A) characters.
ComFreek

Спасибо, ты сделал мой день! Я был просто сбит с толку, потому что, когда я отправляю содержимое из textarea на osx / chrome, браузер отправляет его с CR LF ..
starikovs

3
Другой вопрос, почему, когда вы получаете ".length" текстового поля, он считает CR LF только одним символом, но когда вы проверяете на стороне сервера (например, с PHP strlen), это будет два
символа

2
Ссылка @ ComFreek выше сегодня не работает, используйте: w3.org/TR/html5/forms.html#the-textarea-element
Glen Mazza

@starikovs, я полагаю, на это ответили внутренним значением, называемым «значением API», где разрывы строк нормализованы до LF (только); часть. То, что вы видите как один символ (а именно \n), вероятно, предоставляется «внутренним API». Никаких ссылок, это всего лишь мои предположения, основанные на здравом смысле.
user907860

12

Говоря конкретно о текстовых полях в веб-формах, для всех текстовых полей на всех платформах \r\nбудет работать.

Если вы используете что-то еще, вы вызовете проблемы с вырезанием и вставкой на платформах Windows.

Разрывы строк будут канонизированы браузерами Windows при отправке формы, но если вы отправите форму в браузер с разрывами строк \n, вы обнаружите, что текст не будет правильно копироваться и вставляться, например, между блокнотом и текстовым полем.

Интересно, что, несмотря на то, что в Unix соглашение о конце строки является \nстандартом для большинства текстовых сетевых протоколов, включая HTTP, SMTP, POP3, IMAP и так далее \r\n. Да, возможно, в этом нет большого смысла, но для вас это история и новые стандарты!


6

Кажется, что, согласно спецификации HTML5 , свойство value элемента textarea должно возвращать '\ r \ n' для новой строки:

Элемента значение определяется как исходное значение элемента с применено следующее преобразование:

Заменить все вхождения символа «CR» (U + 000D), за которым не следует символ «LF» (U + 000A), и каждое вхождение символа «LF» (U + 000A), которому не предшествует «CR» ( U + 000D) двухсимвольной строкой, состоящей из пары символов U + 000D CARRIAGE RETURN «CRLF» (U + 000A).

После ссылки на 'value' становится ясно, что это относится к свойству value, доступному в javascript:

Элементы управления формой имеют ценность и проверяемость. (Последний используется только элементами ввода.) Они используются для описания того, как пользователь взаимодействует с элементом управления.

Однако во всех пяти основных браузерах (использующих Windows, 27.11.2015), если '\ r \ n' записывается в текстовое поле, '\ r' удаляется. (Для проверки: var e = document.createElement ('textarea'); e.value = '\ r \ n'; alert (e.value == '\ n');) Это верно для IE, начиная с версии v9. До этого IE возвращал '\ r \ n' и конвертировал '\ r' и '\ n' в '\ r \ n' (что является спецификацией HTML5). Итак ... я в замешательстве.

В целях безопасности обычно достаточно использовать '\ r? \ N' в регулярных выражениях вместо просто '\ n', но если последовательность новой строки должна быть известна, в приложении можно выполнить тест, подобный приведенному выше.


На той же странице значение, полученное с помощью JS, не называется значением API?
Аншул

@Anshul - я понимаю, о чем вы. Первоначальный вопрос был: «В настоящее время отправка из google chrome, когда я просматриваю значение, я обнаруживаю, что оно использует \ r \ n для новых строк ...» Итак, поскольку он «отправляется», я предполагаю, что значение считывается сервер. Я предположил, что это было с JS. В любом случае, надеюсь, факты, которые я опубликовал, пригодятся. Спасибо за ваш комментарий.
barncat

@brancat, я думаю, что язык сервера здесь не имеет значения. Спецификация HTML5 очень ясна по двум вопросам для файла textarea. 1. В теле запроса будет только \ r \ n. 2. В JS-значении будет только \ n, независимо от того, используете ли вы при вводе \ r, \ r \ n или \ n. Это также соответствует вашему открытию с IE9 +.
Аншул

5

- Line Feed and 
 Carriage Return

Эти HTML-объекты вставят новую строку или возврат каретки внутри текстовой области.


11
на самом деле не отвечает на вопрос
cherouvim

2
@cherouvim, я не могу понять, почему вы проголосовали за этот ответ? Вы читали вопрос выше? Пожалуйста, не давайте грубых ответов или комментариев, ничего не понимая!
Mahbub

3
@Mahbub: В настоящее время этот ответ получил 3 отрицательных голоса, потому что он не отвечает на вопрос.
cherouvim

Не отвечает на вопрос.
Майк Девенни

1
Ну искал то, что & # 13; имел в виду, и этот ответ помог мне, так что не расстраивайтесь, вся информация является хорошей информацией и помогает людям в случайные моменты :)
jackrabbithanna
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.