Який символ представляє новий рядок у текстовій області


86

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

Мені подобається перетворювати нові рядки, введені в текстову область, у [кому], щоб результат міг бути представлений в одному рядку, моє запитання ...

В даний час, надсилаючи з google chrome, коли я переглядаю значення, я виявляю, що воно використовується \r\nдля нових рядків. Якщо я заміню, \r\nя знаю, що це буде працювати для chrome у Windows 7, але як щодо інших платформ, чи є варіанти того, що інші браузери вставлять як новий рядок всередину текстової області?


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

Відповіді:


104

Відповідно до специфікацій HTML, браузери повинні канонізувати розриви рядків у введенні користувачем до CR LF ( \r\n), і я не думаю, що будь-який браузер це помиляє. Посилання: пункт 17.13.4 Типи вмісту форми у специфікації HTML 4.01.

У проектах HTML5 ситуація є більш складною, оскільки вони також мають справу з процесами всередині браузера, а не лише з даними, які надсилаються до обробника форми на стороні сервера, коли форма подається. Відповідно до них (і практики браузера) textareaзначення елемента існує у трьох варіантах:

  1. вихідне значення, введене користувачем, ненормалізоване; він може містити пару CR, LF або CR LF;
  2. внутрішнє значення, що називається “значення API”, де розриви рядків нормалізуються до LF (лише);
  3. значення подання, де розриви рядків нормуються до пар LF CR відповідно до Інтернет-конвенцій.

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) буде два символу ...
starikovs

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

@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 CARRAGE 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

Не відповідає на запитання.
Mike Devenney

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