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


760

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


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 занимался тем и другим, то есть готовился набрать новую строку. По прошествии времени физическая семантика кодов оказалась неприменимой, а память и пространство на гибких дисках были очень важны, некоторые разработчики ОС решили использовать только один из символов, они просто не очень хорошо общались друг с другом; -)

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


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


46

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

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

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


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 и так далее.


7

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

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


5

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

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

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

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

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


1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.