Почему Windows использует CR LF? - PullRequest
71 голосов
/ 29 июня 2011

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

Ответы [ 6 ]

79 голосов
/ 29 июня 2011

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

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

20 голосов
/ 14 января 2016

@ sshannin опубликовал URL из блога Рэймонда Чена, но он больше не работает. Блог изменил свое внутреннее программное обеспечение, поэтому URL-адреса изменились.

Пролистав старые посты в новом блоге, я нашел его здесь .

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

Почему терминатор строки CR + LF?

Этот протокол восходит ко временам телетайпов. CR стоит для «возврата каретки» - контрольный символ CR вернул отпечаток голова («каретка») к колонке 0 без продвижения бумаги. 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. Если вы неправильно установили этот параметр, вы получить текст ступеньки, где

каждый

строка

начинается

где предыдущая строка остановилась. Так что даже Unix, когда он оставлен в необработанном режиме, требует CR + LF для завершения строк. Неявный CR до того, как LF является изобретением Unix, вероятно, как экономика, так как это экономит один байт на строку.

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

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

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

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

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

16 голосов
/ 29 июня 2011

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

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

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

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

1 голос
/ 06 декабря 2012

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

1 голос
/ 10 января 2012

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

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

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

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

1 голос
/ 29 июня 2011

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

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

...