Я понимаю разницу между ними, поэтому нет необходимости вдаваться в подробности, но мне просто интересно, какова причина того, почему Windows использует как CR, так и LF для обозначения разрыва строки. Кажется, что метод Linux (просто с использованием LF) имеет гораздо больше смысла, экономит место и его легче анализировать.
Почему Windows использует CR LF?
Ответы (6)
Исторически сложилось так, что при использовании матричных принтеров телетайпов CR возвращал каретку в первую позицию строки, а LF переводил ее на следующую строку. Использование CR+LF в самом файле позволило отправить файл непосредственно на принтер без какого-либо драйвера принтера.
Спасибо @zaph за указание на то, что это были телетайпы, а не матричные принтеры
@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 году, так что уровень путаницы стал еще выше.
Я изменил эту вторую ссылку на снимок в Wayback Machine, так как фактическая страница больше не доступна.
Надеюсь, это ответит на ваш вопрос.
Это происходит от телетайпов (и пишущих машинок) прошлых дней.
Раньше, когда вы заканчивали печатать строку, вам приходилось перемещать каретку пишущей машинки (которая удерживала бумагу и двигалась влево, когда вы печатали) обратно в начало строки (CR). Затем вам нужно было продвинуть бумагу вниз по строке (LF), чтобы перейти к следующей строке.
Есть случаи, когда вы, возможно, не хотели переводить строку при возврате каретки, например, если вы собирались зачеркнуть символ тире (вы бы просто перезаписали его).
Но в основном все сводится к соглашению. В DOS использовалось полное соглашение CR/LF, а в UNIX оно было немного сокращено. Теперь мы застряли!
Из Википедии:
Последовательность CR+LF широко использовалась во многих ранних компьютерных системах, которые использовали телетайпы, обычно ASR33, в качестве консольного устройства, потому что эта последовательность требовалась для размещения этих принтеров в начале новой строки.
Другие дали ответ, но я хотел добавить... Наверное, вы слишком молоды, чтобы пользоваться пишущей машинкой? ;) Карета - барабан. Если переместить его горизонтально вправо, стационарная головка вернется к левому полю страницы. Вращение каретки пальцем и большим пальцем перемещает страницу на одну строку (строки).
Я видел не один аккаунт о том, что причина отправки двух символов (а иногда и больше) вместо одного заключалась в том, чтобы лучше сопоставить скорость передачи данных с физической скоростью печати (это было давно эм>). Перемещение печатающей головки занимало больше времени, чем печать одного символа, а отправка дополнительных символов была способом предотвращения опережения передачи данных над печатающим устройством. Таким образом, причина, по которой у нас есть несколько символов для конца строки в Windows, в основном такая же, как и причина, по которой у нас есть QWERTY-клавиатуры — она была предназначена для замедления работы.
Очевидно, причина, по которой эта практика продолжается в Windows по сей день, основана на некотором понятии постоянной обратной совместимости и, в конечном счете, просто на простой инерции.
Однако следует отметить, что это соглашение строго не соблюдается Windows на уровне операционной системы. Любое приложение Windows может игнорировать соглашение, в зависимости от того, с какими другими приложениями оно пытается быть совместимым.
Интересно, что в статье Википедии о "новой строке" утверждается, что Windows 8 может внести изменения в использование только LF. В статье также говорится, что в Mac OS X реализован переход от LF+CR к просто LF.
CR
LF
оно почти наверняка ложно. Почему кто-то решил использовать такой семантически специфический символ с довольно высоким риском побочных эффектов только для вставки задержки? Тем более, что NUL
существует именно для этой цели. Из RFC 20 1969 года по ASCII: NUL (Null): все нули символ, который может служить для заполнения времени и медиа-заполнения.
- person Daniel Saner; 06.06.2019