Чи надсилають браузери "\ r \ n" або "\ n" чи це залежить від браузера?


102

Це питання мене турбує мільйон років ... щоразу, коли я створюю веб-сайт із текстовою областю, яка дозволяє багаторядкові (наприклад, "Біо" для профілю користувача), я завжди закінчую написання наступного параноїдального коду:

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

Отже, що надсилає браузер, <textarea name="Bio"></textarea>якщо він має кілька рядків?


Нічого собі, я подумав, що це дивне питання, яке не збирається привертати уваги ... але 16 голосів за 1 годину, божевілля.
Тімоті Хорі

Думаючи про це, я ніколи не стикався з проблемою, пов’язаною з цим. Якщо хтось переходить у новий рядок, він відображається як новий рядок, у всіх ОС, у клієнтах MySQL, у браузерах тощо. Виглядає, що це означає, що більшість програмного забезпечення має певну послідовність у цьому питанні. Звичайно, якщо я збираюся зробити щось важливе з цим, я завжди нормалізуюсь.
Halil Özgür

Проблема виникне, якби я покладався на "\ r \ n", а потім будував "HTML-формат" версії біографії користувача, і оскільки я ніколи не натрапляю на "\ r \ n", я кладу це все в один <p>тег.
Тімоті Хорі

Відповіді:


50

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

Ось цитата із специфікації HTTP / 1.1 про заголовки повідомлень:

Термінальним рядком для полів заголовка повідомлень є послідовність CRLF. Однак ми рекомендуємо, щоб програми, розбираючи такі заголовки, розпізнавали один LF як термінатор лінії та ігнорували провідний CR.

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


6
Я не вірю, що специфікації визначають, що виробляє textarea.
Марк Томас

2
@Will: ще раз прочитайте оригінальне запитання. Він спеціально запитує про те, як браузери кодують вміст textarea(це те, що специфікація або принаймні цитований розділ Теда не обмежує).
Іван Варфоломій

2
@Mark - ти маєш рацію. На цій форумі існують нескінченні дискусії щодо цієї проблеми. (Дивіться цю тему з 1995 року від робочої групи HTML.
Тед Хопп,

2
Цю відповідь потрібно відредагувати. Він починається з посилань на специфікацію HTTP, але це не стосується текстових областей.
DuckMaestro

2
Я це зробив, але відповідь все ж починається з цитування HTTP, що є неправильною специфікацією, яку слід підкреслити, якщо згадувати взагалі. Включена цитата конкретно адреси "поля заголовка повідомлення", але textareas не надсилаються як поля заголовка повідомлень. textareas кодується в тілі повідомлення, яке відрізняється.
DuckMaestro

30

що браузери надсилають, <textarea></textarea>якщо у нього є кілька рядків?

Усі сучасні браузери надсилають CRLF (\r\n ). Однак це не те, що було задовільно стандартизовано, тому я, безумовно, вважаю, що варто нормалізувати нові рядки у введенні багаторядкового тексту.

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


Чи поводиться JavaScript послідовно в будь-якому конкретному веб-переглядачі на всіх платформах? (Наприклад, чи повертає Firefox рядки з LF на Windows, Macs і мобільних платформах?)
Тед Хопп

1
@ Ted: така поведінка узгоджується на платформах у Firefox, Opera та WebKit. IE5 / Mac Я не тестував, оскільки він уже давно мертвий, але цей браузер має багато відмінностей від IE5 / Win.
bobince
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.