Почему Windows использует CR LF?

87

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

Кайл
источник
3
Newline # History
Тим Купер
1
Из блога Рэймонда Чена: blogs.msdn.com/b/oldnewthing/archive/2004/03/18/91899.aspx
sshannin
Вот википедия по истории новой строки: en.wikipedia.org/wiki/Newline#History
Szocske
Возможно, стоит отметить, что CRLF в Windows в основном используется по умолчанию. Большинство программ поддерживают и то, и другое (хотя, возможно, вам придется повозиться с настройками). Лично я почти никогда не использую CRLF, отдавая предпочтение LF в стиле UNIX; только несколько программ все еще имеют проблемы с файлами, которые используют только LF.
Кевин
CR + LF - правильный способ сделать это (это стандарт ), поэтому вопрос не в том, почему Windows делает это правильно, а в том, почему Mac и Unix / Linux делают это неправильно. Наследие автономного LF - это лень и ярлык. Я всегда CR + LF, за исключением некоторых вещей Linux, которые смотрят на CR + LF, поэтому я перехожу в режим LF для этого. ИМО, неверная интерпретация CR + LF намного хуже, чем неверная интерпретация автономного LF.
InterLinked

Ответы:

97

Исторически при использовании матричные принтеры телетайпы CR вернет каретку в первую позицию строки, а LF передаст на следующую строку. Использование CR + LF в самом файле позволило отправить файл прямо на принтер без какого-либо драйвера принтера.

Спасибо @zaph, указав, что это были телетайпы, а не матричные принтеры

Андерс Абель
источник
47
Очень частое раздражение с очень небольшой пользой.
Давид Хорват,
7
@Anders На самом деле причиной были телетайпы, CR вернул печатающую головку влево, а LF продвинул бумагу. Телетайпы предшествовали матричным принтерам.
zaph 06
5
@zaph Вот почему я люблю Stack Overflow. 2 года спустя я получил поправку и узнал что-то новое.
Anders Abel
Поскольку Windows следовала за Unix на столько лет, вызывает недоумение то, что они не следовали модели Unix только LF.
belanger
32

@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 unix перенесли это соглашение в стандарт языка C, который требует только «\ n» (который кодирует LF) для завершения строк, возлагая на библиотеки времени выполнения бремя преобразования необработанных данных файла в логические строки.

В языке C также был введен термин «новая строка», чтобы выразить понятие «общий терминатор строки». Мне сказали, что комитет ASCII изменил имя символа 0x0A на «новую строку» примерно в 1996 году, так что уровень путаницы был еще выше.

Вот еще одно обсуждение этой темы с точки зрения unix.

Я изменил эту вторую ссылку на снимок в The Wayback Machine, поскольку фактическая страница больше не доступна.

Надеюсь, это ответит на ваш вопрос.

OMA
источник
Поскольку вы на самом деле не отвечаете на вопрос, а просто исправляете ссылку, которая стала устаревшей, в комментарии , это действительно должен быть комментарий. В любом случае спасибо за правильную ссылку. Пожалуйста, добавьте это как комментарий, этот ответ может быть удален.
Том Брунберг,
1
Хорошо, я добавил сюда текст из блога, поэтому, если ссылка снова не работает, текст все еще доступен здесь. Я думаю, что это следует сохранить как ответ, а не просто комментарий, поскольку эта информация фактически отвечает на первоначально заданный вопрос.
OMA
9
Я действительно ненавижу то, как Microsoft регулярно отменяет свои ссылки.
Марк Рэнсом
2
Этот ответ более подробен, чем исключенный, и отвечает не только на заданный вопрос, но и на предполагаемую причину вопроса, ИМХО, так лучше.
Алексей Мартьянов
18

Он исходит от телетайпов (и пишущих машинок) с давних времен.

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

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

Но в основном все сводится к условности. DOS использовала полное соглашение CR / LF, а UNIX немного сократила его. Теперь мы застряли!

Дэйв Маркл
источник
2

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

как дзюдо
источник
2
Печатная машинка? Кажется, однажды я видел один из таких в музее :)
Кайл
@Kyle, мне пришлось рассмеяться, и это
скрасило
1

Из Википедии :

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

Ник Хайдке
источник
1

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

Очевидно, что причина, по которой эта практика продолжается в Windows по сей день, основана на некотором понятии постоянной обратной совместимости и, в конечном счете, просто на простой инерции.

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

Интересно, что статья в Википедии о «Newline» утверждает, что Windows 8 может внести изменения в использование только LF. В статье также говорится, что Mac OS X представила переход от LF + CR к только LF.

Брент Брэдберн
источник
4
«Предназначен для замедления» - цитата нужна.
Эллиот Гороховский
4
Собственно, весь первый абзац - цитата нужна.
Эллиот Гороховский
2
Вот близкая по теме статья Джеффа Этвуда, которая ссылается на то же содержимое Википедии: Великий раскол новой строки . Там также есть много умных комментариев пользователей, в том числе некоторые подтверждения моей точки зрения, что это не проблема уровня операционной системы и что большинство приложений Windows будут отлично работать с текстовыми файлами только LF. Также есть забавный комментарий: «Windows 10 использует CR / LF для обеспечения совместимости с телетайпом Model 33 1963 года ».
Brent Bradburn
1
@ RenéG Мне не нужна ссылка, я был там и сам видел. Некоторым ранним матричным принтерам требовалось добавить даже несколько дополнительных NUL, потому что по мере увеличения скорости передачи интерфейса головная головка не могла справиться даже с двумя символами времени. Эта проблема исчезла, когда в картину вошли буферизация и управление потоком, но у ранних принтеров этого не было. Наконец, когда принтеры стали выводить, они перешли только на параллельный интерфейс со встроенным квитированием.
Марк Рэнсом
1
«Вопреки распространенному мнению, раскладка QWERTY не была предназначена для замедления работы машинистки,…» - Свойства | QWERTY - Википедия
Джейсон