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

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


person Kyle    schedule 29.06.2011    source источник
comment
Новая строка#История   -  person Tim Cooper    schedule 29.06.2011
comment
Из блога Раймонда Чена: blogs.msdn.com/b /oldnewthing/archive/2004/03/18/91899.aspx   -  person sshannin    schedule 29.06.2011
comment
Вот википедия об истории новой строки: en.wikipedia.org/wiki/Newline#History   -  person Szocske    schedule 29.06.2011
comment
Возможно, стоит отметить, что CRLF в Windows в основном является просто соглашением/по умолчанию. Большинство программ поддерживают и то, и другое (хотя вам, возможно, придется возиться с настройками). Лично я почти никогда не использую CRLF, предпочитая LF в стиле UNIX; только несколько программ все еще имеют проблемы с файлами, которые просто используют LF.   -  person Kevin    schedule 15.02.2017
comment
CR+LF — правильный способ сделать это (это стандарт), поэтому вопрос не в том, почему Windows делает это правильно, а в том, почему Mac и Unix/Linux делают это неправильно. Наследие автономного LF — это лень и поиск коротких путей. Я всегда использую CR+LF, за исключением некоторых вещей в Linux, которые таращатся на CR+LF, поэтому для этого я переключаюсь в режим LF. ИМО, неверная интерпретация CR + LF намного хуже, чем неверная интерпретация отдельного LF.   -  person InterLinked    schedule 15.04.2020
comment
В статье Newline#History предполагается, что CR+LF является стандартом в соответствии с ASA. . Стандарт ISO поддерживает как LF, так и CR+LF. Так что я думаю, что жизнь более тонкая @InterLinked :)   -  person chhabrakadabra    schedule 22.07.2020
comment
@chhabrakadabra Все стандарты в значительной степени CR + LF. См. stackoverflow.com/questions /6521685/why-does-windows-use-cr-lf/ — LF был запутанным ярлыком, который никогда официально не был стандартом. Факт остается фактом: он плохо работает с CR+LF. Таким образом, все эти годы спустя было бы правильно обвинить * nix в страданиях новой строки из-за использования LF, а не Windows. Люди склонны думать, что Windows виновата просто потому, что Windows лучше справляется с различными окончаниями строк, чем Unix.   -  person InterLinked    schedule 22.07.2020


Ответы (6)


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

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

person Anders Abel    schedule 29.06.2011
comment
Очень распространенное раздражение при очень небольшой пользе. - person Dávid Horváth; 04.05.2016
comment
@Anders На самом деле причиной были телетайпы, CR вернул печатающую головку влево, а LF продвинул бумагу. Телетайпы предшествовали матричным принтерам. - person zaph; 06.07.2018
comment
@zaph Вот почему я люблю переполнение стека. 2 года спустя, и я получаю исправление и узнал что-то новое. - person Anders Abel; 09.07.2018
comment
Поскольку Windows следовала за Unix на протяжении стольких лет, вызывает недоумение тот факт, что они не следовали модели Unix, состоящей только из LF. - person belanger; 07.01.2021
comment
@belanger так же озадачивает, почему Unix не последовала за DEC или ASA (Американская ассоциация стандартов), которые предшествовали Unix. DEC использовал CR / LF, я полагаю. IBM/360, который я использовал в колледже, также использовал CRLF, но EBCDIC, по-видимому, не использовал. Кроме того, ознакомьтесь с RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) или RFC 2616 (HTTP). Они используют CR/LF. - person J. Gwinner; 13.04.2021

@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, вероятно, в целях экономии, поскольку он сохраняет один байт на строку.

Предки Unix языка C перенесли это соглашение в стандарт языка C, который требует только «\n» (которое кодирует LF) для завершения строк, возлагая бремя на библиотеки времени выполнения для преобразования необработанных файловых данных в логические строки.

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

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

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

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

person OMA    schedule 14.01.2016
comment
Поскольку вы на самом деле не отвечаете на вопрос, а просто исправляете устаревшую ссылку в комментарии , это действительно должен быть комментарий. В любом случае, спасибо за правильную ссылку. Пожалуйста, добавьте это как комментарий, этот ответ может быть удален. - person Tom Brunberg; 15.01.2016
comment
ОК, я добавил сюда текст из блога, поэтому, если ссылка снова испортится, текст все еще доступен здесь. Я думаю, что это следует сохранить как ответ, а не просто комментарий, поскольку эта информация фактически отвечает на первоначально заданный вопрос. - person OMA; 18.01.2016
comment
Я действительно ненавижу то, как Microsoft регулярно устаревает свои ссылки. - person Mark Ransom; 27.01.2017
comment
Этот ответ более подробный, чем исключенный, и отвечает не только на заданный вопрос, но и на предполагаемую причину вопроса, ИМХО, это лучше. - person Alexei Martianov; 07.02.2019

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

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

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

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

person Dave Markle    schedule 29.06.2011

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

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

person Nick Heidke    schedule 29.06.2011

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

person likejudo    schedule 06.12.2012
comment
Печатная машинка? Кажется, однажды я видел один из них в музее :) - person Kyle; 07.12.2012
comment
@Kyle Мне пришлось посмеяться, и это скрасило мой день :) - person likejudo; 19.08.2019

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

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

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

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

person Brent Bradburn    schedule 09.01.2012
comment
Предназначен для замедления работы - необходима ссылка. - person Elliot Gorokhovsky; 20.03.2015
comment
Собственно, весь первый абзац - цитата обязательна. - person Elliot Gorokhovsky; 20.03.2015
comment
Вот одна цитата, касающаяся обоснования выбора времени. См. печатающая головка не может вернуться из крайнего правого положения в начало следующей строки за один символ. Статья в Википедии также содержит цитату (включая справочник по текстовому редактору Vim), хотя неясно, насколько авторитетен этот источник. - person Brent Bradburn; 21.03.2015
comment
@RenéG Мне не нужна цитата, я был там и видел это сам. Некоторым ранним матричным принтерам требовалось даже несколько дополнительных NUL, добавленных для хорошей меры, потому что по мере увеличения скорости передачи интерфейса головка не могла справиться даже с двумя символами, стоящими времени. Эта проблема исчезла, когда на сцену вышли буферизация и управление потоком, но в ранних принтерах этого не было. Наконец, когда принтеры стали использоваться только для вывода, они перешли к параллельному интерфейсу со встроенным квитированием. - person Mark Ransom; 27.01.2017
comment
@JasonSparc: Да, наверное, это миф. К сожалению, я не могу прочитать исходный материал (японский), чтобы узнать правду. - person Brent Bradburn; 27.02.2019
comment
Рассуждение правильное, но как объяснение CR LF оно почти наверняка ложно. Почему кто-то решил использовать такой семантически специфический символ с довольно высоким риском побочных эффектов только для вставки задержки? Тем более, что NUL существует именно для этой цели. Из RFC 20 1969 года по ASCII: NUL (Null): все нули символ, который может служить для заполнения времени и медиа-заполнения. - person Daniel Saner; 06.06.2019