Чому Windows використовує CR LF?


85

Я розумію різницю між цими двома, тому немає необхідності вдаватися до цього, але мені просто цікаво, в чому полягає причина, чому Windows використовує як CR, так і LF для позначення розриву рядка. Здається, що метод Linux (просто використання LF) має набагато більше сенсу, економить простір і легше аналізувати.



1
З блогу Реймонда Чена: blogs.msdn.com/b/oldnewthing/archive/2004/03/18/91899.aspx
sshannin

Ось вікіпедія з історії нового рядка: en.wikipedia.org/wiki/Newline#History
Шоцке

Можливо, варто зауважити, що CRLF для Windows - це, в основному, лише умовні позначення / за замовчуванням. Більшість програм підтримує будь-яку (хоча, можливо, вам доведеться возитися з налаштуваннями). Я особисто майже ніколи не використовую CRLF, замість цього використовую LF у стилі UNIX; лише деякі програми все ще мають проблеми з файлами, які просто використовують НЧ.
Кевін

CR + LF - це правильний спосіб (це стандарт ), тому питання полягає не в тому, чому Windows робить це правильно, а в тому, чому Mac та Unix / Linux роблять це неправильно. Спадщина автономної НЧ - це лінощі та швидкий шлях. Я завжди CR + LF, за винятком деяких речей Linux, які дивляться на CR + LF, тому для цього я переходжу в режим LF. ІМО, неправильне тлумачення CR + LF набагато гірше, ніж неправильне тлумачення окремого НЧ.
InterLinked

Відповіді:


96

Історично при використанні матричні принтери телетайпи CR повертали каретку в перше положення рядка, тоді як LF подавав у наступний рядок. Використання CR + LF у самому файлі дозволило надіслати файл безпосередньо на принтер, без будь-якого драйвера принтера.

Дякую @zaph, вказуючи, що це були телетайпи, а не матричні принтери


46
Дуже поширене роздратування з дуже малою користю.
Давід Горват,

7
@Anders Насправді причиною були саме телетайпи, CR повернув друкуючу головку ліворуч, а LF просунув папір. Телетипи передували матричним принтерам.
zaph

5
@zaph Ось чому я люблю Stack Overflow. Через 2 роки я отримую виправлення і дізнався щось нове.
Андерс Абель

30

@sshannin опублікував URL-адресу з блогу Реймонда Чена, але це вже не працює. Блог змінив своє внутрішнє програмне забезпечення, тому URL-адреси змінилися.

Після сканування старих публікацій у новому блозі я знайшов його тут .

Цитата з блогу:

Чому лінійний термінатор CR + LF?

Цей протокол бере свій початок з часів авторів телетайпів. CR означає «повернення каретки» - керуючий символ CR повернув друкуючу головку («каретку») у стовпець 0 без просування паперу. LF розшифровується як «подача лінії» - символ керування LF просунув папір на один рядок, не рухаючи друкуючої головки. Отже, якщо ви хочете повернути друкуючу головку в нульовий стовпець (готовий до друку наступного рядка) і просунути папір (щоб він друкувався на новому папері), вам потрібні як CR, так і LF.

Якщо ви перейдете до різних документів Інтернет-протоколу, таких як RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) або RFC 2616 (HTTP), ви побачите, що всі вони визначають CR + LF як послідовність завершення рядка. Тож справжнє питання полягає не в тому, «чому CP / M, MS-DOS та Win32 використовують CR + LF як термінатор лінії?» а швидше "Чому інші люди вирішили відрізнятися від цих стандартних документів і використовувати інший термінатор лінії?"

Unix прийняв звичайний LF як послідовність закінчення лінії. Якщо ви подивитесь на опції stty, то побачите, що параметр onlcr визначає, чи слід LF змінювати на CR + LF. Якщо ви неправильно сприймаєте це налаштування, ви отримуєте текст східця, де

each
    line
        begins 

де попередній рядок зупинився. Отже, навіть якщо unix залишається в необробленому режимі, потрібні CR + LF для завершення рядків. Неявний CR перед LF є унікальним винаходом, можливо, як економія, оскільки він економить один байт на рядок.

Родовід Unix мови C переніс цю конвенцію у стандарт мови C, який вимагає лише “\ n” (який кодує LF) для завершення рядків, покладаючи навантаження на бібліотеки середовища виконання для перетворення необроблених файлових даних у логічні рядки.

Мова С також запровадила термін "новий рядок", щоб виразити поняття "загальний термінатор рядка". Мені кажуть, що комітет ASCII змінив назву символу 0x0A на "новий рядок" приблизно в 1996 році, тому рівень плутанини був підвищений ще вище.

Ось ще одне обговорення цієї теми з точки зору Unix

Я змінив це друге посилання на знімок у The Wayback Machine, оскільки фактична сторінка вже недоступна.

Сподіваюся, це відповідає на ваше запитання.


Оскільки ви насправді не відповідаєте на питання, а лише виправляєте посилання, яке застаріло, у коментарі це справді має бути коментарем. У будь-якому разі, дякую за правильне посилання. Будь ласка, додайте його як коментар, ця відповідь може бути видалена.
Том Брунберг

1
Добре, я додав сюди текст із блогу, тож якщо посилання знову зіпсується, текст все ще доступний тут. Я думаю, що це слід тримати як відповідь, а не просто як коментар, оскільки ця інформація насправді відповідає на запитання, яке спочатку було задано.
OMA

7
Я дуже ненавиджу те, як Microsoft регулярно застаріває їх посилання.
Марк Ренсом,

1
Ця відповідь є більш детальною, ніж виняток, і відповідає не лише на поставлене запитання, але й вгадує причину запитання. ІМХО, це краще.
Олексій

18

Це походить від телетайпових машин (і друкарських машинок) ще з давніх часів.

Раніше було так, що коли ви закінчували вводити рядок, вам довелося перенести каретку друкарської машинки (яка тримала папір і ковзала вліво під час набору тексту) назад на початок рядка (CR). Потім вам довелося просунути папір вниз по лінії (LF), щоб перейти до наступного рядка.

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

Але в основному це зводиться до умовності. DOS використовував повну конвенцію CR / LF, а UNIX трохи скоротив її. Тепер ми застрягли!


2

Інші дали відповідь, але я хотів додати ... Думаю, ви занадто молоді, щоб користуватися друкарською машинкою? ;) Карета - це барабан. Переміщаючи його горизонтально вправо, повертає головку нерухомого типу назад до лівого краю сторінки. Обертаючи каретку пальцями та великим пальцем, сторінка просувається на один рядок (-и).


2
Друкарська машинка? Здається, одного разу я бачив одного з них у музеї :)
Кайл,

@Kyle Мені довелося посміятися, і це
скрасило

1

З Вікіпедії :

Послідовність CR + LF була загальновживаною у багатьох ранніх комп'ютерних системах, які прийняли телетайпні машини, як правило, ASR33, як консольний пристрій, оскільки ця послідовність була потрібна для розташування цих принтерів на початку нового рядка.


1

Я бачив більше одного облікового запису, що причина надсилання двох символів (а іноді і більше) замість одного полягала в тому, щоб краще відповідати швидкості передачі даних фізичній швидкості друку ( це було давно ). Переміщення друкуючої головки зайняло більше часу, ніж друк одного символу, а надсилання зайвих символів було способом запобігання передачі даних попереду друкуючого пристрою. Отже, причина того, що у нас є кілька символів для кінця рядка в Windows, в основному така ж, як і причина, по якій у нас є клавіатури QWERTY - вона мала на меті уповільнити ситуацію .

Очевидно, причина, по якій ця практика зберігається в Windows і донині, заснована на певному уявленні про постійну зворотну сумісність і, зрештою, просто просту інерцію.

Однак слід зазначити, що ця умова не суворо виконується Windows на рівні операційної системи . Будь-яка програма Windows може вільно ігнорувати конвенцію, залежно від того, з якими іншими програмами вона намагається бути сумісною.

Цікаво, що стаття Вікіпедії про "Newline" стверджує, що Windows 8 може внести зміни до використання лише НЧ. У статті також зазначено, що Mac OS X запровадив перехід від LF + CR до просто LF.


4
"Призначений для уповільнення" - потрібне цитування.
Елліот Гороховський

4
Власне, весь перший абзац - потрібне цитування.
Елліот Гороховський

2
Ось тісно пов'язана стаття Jeff Atwood , що посилання той же контент Вікіпедії: The Great Newline Schism . Там також є багато розумних коментарів користувачів - у тому числі деяке обгрунтування моєї думки, що це не проблема на рівні операційної системи, і що більшість програм Windows будуть чудово працювати з текстовими файлами, що мають лише НЧ. Існує також цікавий коментар: "Windows 10 використовує CR / LF для підтримки сумісності з телетайповим апаратом 1963 Модель 33 ".
Брент Бредберн,

1
@ RenéG Мені не потрібне цитування, я був там і переконався в цьому сам. Деякі ранні матричні принтери вимагали навіть кількох додаткових NUL, які були введені для належного виміру, оскільки зі збільшенням швидкості передачі даних інтерфейсу голова не могла встигати навіть за двома символами, що коштували часу. Ця проблема зникла, оскільки буферизація та контроль потоку увійшли в картину, але у перших принтерів цього не було. Нарешті, оскільки принтери стали лише вихідними, вони перейшли до паралельного інтерфейсу, який мав вбудоване рукостискання.
Марк Ренсом

1
"Всупереч поширеній думці, макет QWERTY не був розроблений, щоб уповільнити машиністку, ..." - Властивості | QWERTY - Вікіпедія
Джейсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.