Разница между типами разрывов строк CR LF, LF и CR?

760

Я хотел бы знать разницу (с примерами, если это возможно) между типами разрывов строк CR LF (Windows), LF (Unix) и CR (Macintosh).

eozzy
источник
9
Очень похоже, но не точный дубликат. \nобычно представлен переводом строки, но это не обязательно перевод строки.
Адриан Маккарти
92
CR и LF являются управляющими символами ASCII и Unicode, \rа также \nявляются абстракциями, используемыми в определенных языках программирования. Закрытие этого вопроса затмевает фундаментальные различия между вопросами и увековечивает дезинформацию.
Эдриан Маккарти
5
@AdrianMcCarthy Это проблема с тем, как близкие голоса действуют как ответы; ответ, утверждающий, что оба были одинаковыми, может быть отклонен, а затем выделен серым, как очень, очень неправильный, но требуется всего 4 согласующих голоса (сопоставимых с голосами против), чтобы произойти очень неправильное закрытие, без возможности противостоять голосованию до тех пор, пока Это случилось.
Джон Ханна
Эта формулировка вопроса, по общему признанию, лучше, но для всех практических целей все тот же вопрос.
Юкка К. Корпела
6
@ JukkaK.Korpela: Нет, это действительно не так. \nне означает то же самое во всех языках программирования.
Адриан МакКарти

Ответы:

349

Это действительно о том, какие байты хранятся в файле. CRэто байт-код для возврата каретки (со времен пишущих машинок) и LFаналогично для перевода строки. Это просто относится к байтам, которые размещены как маркеры конца строки.

Путь больше информации, как всегда, в Википедии .

Питер
источник
53
Я думаю , что это также полезно упомянуть , что CRявляется маскирующим \rи LFявляется маскирующим \n. Кроме того, Википедия: Newline .
Роберт Вунабанди
1
Проще говоря, CR and LFэто просто конец строки и новая строка по этой ссылке , это правильно?
Шайют
@shaijut CR означает возврат каретки. Вот что вернуло карету на пишущих машинках. Итак, в основном правильно.
АлиФуркан
764

CR и LF - управляющие символы, соответственно закодированные 0x0D(13 десятичных знаков) и 0x0A(10 десятичных знаков).

Они используются, чтобы отметить разрыв строки в текстовом файле. Как вы указали, Windows использует два символа последовательности CR LF; Unix использует только LF, а старый MacOS (до Mac OS Mac OS X) использовал CR.

Апокрифическая историческая перспектива:

Как указывает Питер , CR = возврат каретки и LF = перевод строки , два выражения имеют свои корни в старых пишущих машинках / TTY. LF переместил бумагу вверх (но оставил горизонтальное положение идентичным), а CR вернул «каретку» так, чтобы следующий набранный символ находился в крайнем левом положении на бумаге (но на той же строке). CR + LF занимался тем и другим, то есть готовился набрать новую строку. По прошествии времени физическая семантика кодов оказалась неприменимой, а память и пространство на гибких дисках были очень важны, некоторые разработчики ОС решили использовать только один из символов, они просто не очень хорошо общались друг с другом; -)

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

MJV
источник
11
так что на самом деле Windows - единственная ОС, которая правильно использует эти символы, возврат каретки, а затем перевод строки.
Рольф
4
Тогда было бы правильно сказать, что текстовый файл, созданный в Windows, является наиболее совместимым из трех, то есть наиболее вероятным для отображения во всех трех подмножествах ОС?
Прометей
3
@Hashim он может отображаться правильно, но попытка запустить текстовый скрипт оболочки с возвратом каретки обычно приводит к ошибке
Омер
Проще говоря, CR and LFэто просто конец строки и новая строка по этой ссылке , это правильно?
Шайют
Я обнаружил, что некоторые файлы в стиле Windows ( CR+LF) могут отображаться с двойными символами новой строки в других системах. Предположительно редактор, отображающий текст, поддерживает как возврат каретки, так и перевод строки в качестве разделителей новой строки, и, как таковой, может создать 2 строки, где предполагалось 1. Так что покаCR+LF может быть наиболее совместимым, я не думаю, что это без проблем.
Магнус Булл
459

Это хорошее резюме, которое я нашел:

Символ возврата каретки (CR) ( 0x0D, \r) перемещает курсор в начало строки без перехода на следующую строку. Этот символ используется как символ новой строки в операционных системах Commodore и Early Macintosh (OS-9 и более ранних).

Символ перевода строки (LF) ( 0x0A, \n) перемещает курсор вниз к следующей строке, не возвращаясь к началу строки. Этот символ используется как символ новой строки в системах на основе UNIX (Linux, Mac OSX и т. Д.)

Последовательность конца строки (EOL) ( 0x0D 0x0A, \r\n) на самом деле представляет собой два символа ASCII, комбинацию символов CR и LF. Он перемещает курсор вниз на следующую строку и в начало этой строки. Этот символ используется как символ новой строки в большинстве других не-Unix операционных систем, включая Microsoft Windows, Symbian OS и другие.

Источник

Тейлор Лиз
источник
1
Символ «вертикальной табуляции» перемещает курсор вниз и сохраняет положение в строке, а не символ LF. LF это EOL.
12431234123412341234123
2
@TaylorLeese / r / n и / n / r одинаковы?
Vicrobot
175

Поскольку ответа на этот вопрос нет, кратко резюмируем:

Возврат каретки (MAC pre-OSX)

  • CR
  • ASCII код 13

Перевод строки (Linux, MAC OSX)

  • LF
  • \ п
  • Код ASCII 10

Возврат каретки и перевод строки (Windows)

  • CRLF
  • \ Г \ п
  • Код 13 ASCII, а затем код 10 ASCII

Если вы видите ASCII-код в странном формате, это просто числа 13 и 10 с другим основанием / основанием, обычно основание 8 (восьмеричное) или основание 16 (шестнадцатеричное).

http://www.bluesock.org/~willg/dev/ascii.html

ahnbizcad
источник
46

У Джеффа Этвуда есть недавняя запись в блоге об этом: Великий Раскол Newline

Вот суть из Википедии :

Последовательность CR + LF широко использовалась во многих ранних компьютерных системах, в которых в качестве консольного устройства использовались машины телетайпа, как правило, ASR33, поскольку эта последовательность требовалась для позиционирования этих принтеров в начале новой строки. В этих системах текст часто составлялся для совместимости с этими принтерами, поскольку концепция драйверов устройств, скрывающих такие аппаратные детали от приложения, еще не была хорошо разработана; приложения должны были напрямую общаться с телетайпом и следовать его соглашениям.Разделение двух функций скрывало тот факт, что печатающая головка не могла вернуться из крайнего правого края в начало следующей строки за один символ. Вот почему последовательность всегда отправлялась сначала с CR. Фактически часто приходилось отправлять дополнительные символы (лишние CR или NUL, которые игнорируются), чтобы дать время печатающей головке переместиться к левому полю. Даже после того, как телетипы были заменены компьютерными терминалами с более высокой скоростью передачи данных, многие операционные системы все еще поддерживали автоматическую отправку этих символов заполнения для совместимости с более дешевыми терминалами, которым для прокрутки дисплея требовалось несколько раз.

Manu
источник
5
+1 Именно благодаря этому простому пониманию я всегда помню, в каком порядке идет комбинация. Даже сегодня мы можем видеть эту механическую логику в любом струйном принтере (я люблю понимать, так как я ненавижу учиться). Другие мои трюки с памятью: «mac? Return to sender» и «NewLineFeed» (чтобы помнить, что NL === LF, и чтобы помнить \ n, так как CR уже имеет R в своем сокращении)
GitaarLAB
3
«Я сомневаюсь ... два контрольных кода были необходимы для синхронизации». Это не то, что он говорит. Это говорит о том, что здесь есть дополнительные CR и NUL, чтобы дать время для его возвращения, а не исходный CR LF.
Жюльен Руссо
11
@Adrian Будете ли вы принимать личный опыт? 1) В мои старые дни телетайпа, принтер, который мы использовали, требовал <CR><CR><LF>- поэтому, конечно, я экспериментировал только с одним <CR>. Я послал <CR><LF>Aпосле длинной линии, и вы могли слышатьA печатаются до каретки полностью возвращается.
Джон Бургер
11
@Adrian 2) Не забывайте, это было в эпоху электромеханики, когда каждый персонаж выполнял ровно одну функцию. Мы часто подчеркивали слово, печатая строку, затем отправляя <CR><CR>и набирая правильное количество пробелов, затем перепечатывая одно и то же слово: примитивную форму полужирного шрифта.
Джон Бургер
3
@Adrian 3) И наконец, это было использование Бодо (или кода Мюррея), а не ASCII. Пять битов данных, от одного начального бита до полутора стоп-битов. Как ты можешь иметь немного? Подождите немного, прежде чем начать отправку следующего символа, чтобы дать печатающей головке время вернуться в центр.
Джон Бургер
16

CR - код ASCII 13

LF - ASCII код 10.

Теоретически CR возвращает курсор в первую позицию (слева). LF подает одну строку, перемещая курсор на одну строку вниз. Вот как в старые времена вы управляли принтерами и мониторами в текстовом режиме. Эти символы обычно используются для обозначения конца строк в текстовых файлах. Различные операционные системы использовали разные соглашения. Как вы указали, в Windows используется комбинация CR / LF, в то время как в пред-OSX Mac используется только CR и так далее.

DmitryK
источник
7

Системы, основанные на ASCII или совместимом наборе символов, используют либо LF (перевод строки, 0x0A, 10 в десятичном виде) или CR (возврат каретки, 0x0D, 13 в десятичном виде) по отдельности, либо CR, за которым следует LF (CR + LF, 0x0D 0x0A); Эти символы основаны на командах принтера: перевод строки указывает, что из принтера должна выводиться одна строка бумаги, а возврат каретки указывает, что каретка принтера должна вернуться в начало текущей строки.

Вот подробности .

pierrotlefou
источник
5

Печальное состояние «разделителей записей» или «разделителей строк» ​​является наследием мрачных эпох компьютеров.

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

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

Unix и Mac фактически указали абстракцию для конца строки, представьте это. К сожалению, они указали разные. (Unix, гм, пришел первым.) И, естественно, они использовали управляющий код, который уже был «близок» к SOP

Поскольку почти все наше операционное программное обеспечение сегодня является потомком операционной системы Unix, Mac или MS, мы застряли в неразберихе с окончанием строки.

DigitalRoss
источник
1

NL, полученная из EBCDIC NL = x'15 ', которая логически сравнивалась бы с CRLF x'odoa ascii ... это становится очевидным при физическом перемещении данных с мэйнфреймов в средний диапазон. В разговорной речи (поскольку только тайные люди используют ebcdic) NL был приравнен либо к CR, либо к LF, либо к CRLF.

Дэвид
источник