Что такое возврат каретки, перевод строки и подача формы?

501

В чем смысл следующих управляющих символов:

  1. Возврат каретки

  2. Перевод строки

  3. Форма подачи

Ашны
источник
14
Что означает «возврат каретки»? Я не вижу никакой «кареты», «возвращающейся» на моем ноутбуке. : s
Жан Гоминал
12
@JeanHominal каретка в основном означает курсор (или указатель в древних печатных машинках), а return означает возврат к началу этой строки.
СОФЭ
Я не вижу никаких проводов (или стеклянных панелей) в моем "оконечном" "окне", а также нет "телетайпа", прикрепленного к / dev / tty1. Все они стали метафорами.
Писквор покинул здание

Ответы:

622

Возврат каретки означает возврат к началу текущей строки без продвижения вниз. Название происходит от каретки принтера, так как мониторы были редкостью, когда название было придумано. Обычно это экранируется как \r, сокращенно CR , и имеет значение ASCII 13или 0x0D.

Перевод строки означает переход вниз на следующую строку; тем не менее, он был перепрофилирован и переименован. Используемый как "новая строка ", он заканчивает строки (обычно путают с разделительными линиями). Обычно это экранируется как \n, сокращенно LF или NL, и имеет значение ASCII 10или 0x0A. CRLF (но не CRNL) используется для пары \r\n.

Подача формы означает переход вниз на следующую «страницу». Он обычно использовался в качестве разделителей страниц, но теперь также используется в качестве разделителей разделов. (Он редко используется в исходном коде для разделения логически независимых функций или групп функций.) Текстовые редакторы могут использовать этот символ при «вставке разрыва страницы». Обычно это экранируется как \f, сокращенно FF , и имеет значение ASCII 12или 0x0C.


Как управляющие символы, они могут интерпретироваться по-разному.

Наиболее распространенное отличие (и, вероятно, единственное, о чем стоит беспокоиться) - строки заканчиваются CRLF в Windows, NL в Unix-like и CR в старых Mac (ситуация изменилась с OS X, чтобы быть похожей на Unix). Обратите внимание, что смещение значения от LF к NL для одного и того же символа дает различия между Windows и Unix. (Windows, конечно, новее, чем Unix, поэтому она не приняла этот семантический сдвиг. Я не знаю историю Mac, использующих CR.) Многие текстовые редакторы могут читать файлы в любом из этих трех форматов и конвертировать между ними , но не все утилиты могут.

Подача формы немного более интересна (хотя реже используется напрямую), и с обычным определением разделителя страниц она может идти только между строками (например, после последовательности новой строки NL, CRLF или CR) или в начале или конец файла.

Роберто Кабони
источник
10
Я могу подтвердить, что OS X использует NL в качестве ограничителя строки, так же, как Unix (потому что OS X является Unix). CR использовался в Mac OS 9 и ниже.
Рори О'Кейн
1
Символ FF сегодня может показаться странным (наряду с символом-колоколом «CTRL-G»), но он имел большую актуальность, когда видеодисплеи были гораздо реже, а терминалы с твердой копией использовались в качестве дисплеев данных.
Рик Сарвас
Разве это не контроль корма \x0c?
Tjorriemorrie
2
«Я не знаю историю использования Mac с использованием CR». Это, вероятно, пришло от Apple II с использованием CR. CR был распространен и в других 8-битных системах, таких как Commodore и Tandy. ASCII не был универсальным в этих системах: Commodore использовал PETSCII, у которого LF был 0x8d (!). У Атари вообще не было персонажа НЧ. По любой причине CR = 0x0d был более или менее стандартным.
Ssswift
125

\r возврат каретки и перемещает курсор назад, как если бы я

printf("stackoverflow\rnine")
ninekoverflow

означает, что он сместил курсор в начало «stackoverflow» и перезаписывает начальные четыре символа, так как «девять» имеет длину четыре символа.

\n является символом новой строки, который изменяет строку и переводит курсор в начало новой строки, например:

printf("stackoverflow\nnine")
stackoverflow
nine

\f является подачей формы, его использование устарело, но оно используется для предоставления отступов, таких как

printf("stackoverflow\fnine")
stackoverflow
             nine

если я напишу как

printf("stackoverflow\fnine\fgreat")
stackoverflow
             nine
                 great
user3346547
источник
3
Но этот пример не работает на языках высокого уровня!
Сина Карванди
@ ᔕ Я ᑎᗩ Кᗩᖇ ᐯᗩᑎᗪ Я так и делаю: вы можете сделать то же самое в оболочке Linux, используя printfутилиту из coreutils. Или даже используя echo -enвстроенный bash.
Руслан
Как передать все строки как одну строку в файле?
Paras Singh
8
Форма подачи не используется для отступа. Если вы отправите несколько из них на принтер, он выплюнет бумагу. То, что вы описали как \fна самом деле \v- вертикальная вкладка, при условии, что оба выглядят одинаково в консоли.
CpRn
printf("123\f456\f789");показывает /> <bold> 123456789 </ bold> на консоли.
Mayur
31

Взгляните на Википедию :

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

tanascius
источник
25

\fиспользуется для разрыва страницы. Вы не можете увидеть никакого эффекта в консоли. Но когда вы используете эту символьную константу в своем файле, вы можете увидеть разницу.

Другой пример: если вы можете перенаправить вывод в файл, вам не нужно писать файл или использовать обработку файла.

Например:

Написать этот код на С ++

void main()    
{
    clrscr();
    cout<<"helloooooo" ;

    cout<<"\f";
    cout<<"hiiiii" ;

}

и когда вы компилируете это, он генерирует исполняемый файл (например abc.exe)

тогда вы можете перенаправить вывод в файл, используя это:

abc > xyz.doc

затем откройте файл, xyz.docвы можете увидеть фактический разрыв страницы между hellooo и hiiii ....

Балрам Диксит
источник
21

Помимо вышеуказанной информации, есть еще интересная история LF (\ n) и CR (\ r). [Оригинальный автор: 阮一峰 Источник: http://www.ruanyifeng.com/blog/2006/04/post_213.html] До выхода компьютера существовал тип телепринтера под названием Teletype Model 33. Он может печатать по 10 символов каждый второй. Но есть одна проблема: после завершения печати каждой строки, для перехода к следующей строке потребуется 0,2 секунды, то есть время печати 2 символов. Если в течение этих 0,2 секунды будут переданы новые персонажи, этот новый персонаж будет потерян.

Таким образом, ученые нашли способ решить эту проблему, добавив два завершающих символа после каждой строки, один из которых - «Возврат каретки», который говорит принтеру подвести печатающую головку влево .; другой - «Перевод строки», он говорит принтеру переместить бумагу на 1 строку вверх.

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

В UNIX / Mac и Linux '\ n' ставится в конце каждой строки, в Windows '\ r \ n' ставится в конце каждой строки. Следствием этого использования является то, что файлы в UNIX / Mac будут отображаться в одну строку, если они открыты в Windows. В то время как файл в Windows будет иметь один ^ M в конце каждой строки, если он открыт в UNIX или Mac.

wxie
источник
1
С выпуском OSX (на основе BSD Unix) Mac переключился на '\ n' - окончания строки Unix.
Джонатан Кросс
«Файлы в UNIX / Mac будут отображаться в одну строку, если они открыты в Windows». WRITE.EXE(он же Wordpad) может отображать их просто отлично.
thecarpy
18

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

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

янтарный
источник
На самом деле «возврат каретки» не перемещает печатающую головку влево, но перемещает каретку, которая удерживает валик вправо. Раньше для этого был длинный рычаг, который приводился в действие левой рукой. См en.wikipedia.org/wiki/Typewriter
Марк Lakata
2
@MarkLakata Верно для пишущих машинок, но этот ответ касается старых печатных терминалов. Например, DEC LA36 ( columbia.edu/cu/computinghistory/la36.html ).
Питер Кардона
12

Рассмотрим ударный принтер IBM 1403. CR переместил печатающую головку в начало линии, но НЕ продвигал бумагу. Это позволило «наложить», разместив несколько строк вывода на одной строке. Такие вещи, как подчеркивание, были достигнуты таким же образом, как и BOLD print. Л.Ф. продвинул бумагу на одну строку. Если бы не было CR, следующая строка печаталась бы как пошаговый шаг, потому что LF не двигал печатающую головку. Ф.Ф. продвинул статью на следующую страницу. Обычно она также перемещает печатающую головку в начало первой строки на новой странице, но для этого вам может потребоваться CR. Конечно, большинство программистов закодировали CRFF вместо CRLF в конце последней строки на странице, потому что дополнительный CR, созданный FF, не имел бы значения.

Дик Гертин
источник
Это единственный ответ, который объясняет полное значение возврата каретки.
Ли
12

Короче говоря :

Carriage_return ( \rили 0xD): взять на себя управление при запуске той же строки .

Line_Feed ( \nили 0xA): Для того, чтобы взять под контроль при запуске из следующей строки .

form_feed ( \fили 0xC): Для того, чтобы взять под контроль при запуске из следующей страницы .

Ритик Камбой
источник
2
Краткий ответ, как это, следует поощрять.
user5280911
10

В качестве дополнения,

1, возврат каретки : это терминология принтера, означающая изменение местоположения печати в начале текущей строки. В компьютерном мире это означает возврат к началу текущей строки в большинстве случаев, но редко означает новую строку.

2, перевод строки : это терминология принтера, означающая продвижение бумаги на одну строку. Таким образом, возврат каретки и перевод строки используются вместе для начала печати в начале новой строки. В компьютерном мире это обычно имеет то же значение, что и перевод строки.

3, подача формы : это терминология принтера, мне нравится объяснение в этой теме .

Если вы программируете для принтера в стиле 1980-х годов, он извлечет бумагу и начнет новую страницу. Вы практически наверняка никогда не будете нуждаться в этом.

http://en.wikipedia.org/wiki/Form_feed

Это почти устарело, и вы можете обратиться к Escape-последовательности \ f - form feed - что именно? для подробного объяснения.

Обратите внимание, что мы можем использовать CR или LF или CRLF для обозначения новой строки на некоторых платформах, но новая строка не может быть принята ими на некоторых других платформах. Обратитесь к вики Newline для деталей.

LF: Multics, Unix и Unix-подобные системы (Linux, OS X, FreeBSD, AIX, Xenix и т. Д.), BeOS, Amiga, RISC OS и другие.

CR: Commodore 8-битные машины, Acorn BBC, ZX Spectrum, TRS-80, семейство Apple II, Oberon, классическая Mac OS до версии 9, MIT Lisp Machine и OS-9

RS: QNX pre-POSIX реализация

0x9B: 8-битные машины Atari, использующие вариант ASCII ATASCII (155 в десятичном виде)

CR + LF: Microsoft Windows, DOS (MS-DOS, PC DOS и т. Д.), DEC TOPS-10, RT-11, CP / M, MP / M, Atari TOS, OS / 2, Symbian OS, Palm OS, Amstrad CPC и большинство других ранних версий не-Unix и не-IBM

LF + CR: Acorn BBC и RISC OS выводят буферный текст.

Евгений
источник
3

«\ n» - символ перевода строки. Это означает конец текущей строки и переход к новой строке для всех, кто ее читает.

vpit3833
источник
3

Возврат каретки и перевод строки также являются ссылками на пишущие машинки, так как при небольшом нажатии на ручку на левой стороне каретки (место, куда идет бумага), бумага будет вращаться на небольшое количество вокруг цилиндра, продвигаясь вперед. документ одной строкой. Если вы закончили печатать одну строку и хотели перейти к следующей, вы нажимали сильнее, продвигая линию и сдвигая каретку до упора вправо, затем возобновляя ввод слева направо снова, когда каретка перемещалась при каждом нажатии клавиши. , Излишне говорить, что перенос слов был настройкой по умолчанию для всей текстовой обработки эпохи. P: D

TheLastWordSword
источник
2

Это непечатные символы, относящиеся к понятию «новая строка». \ n перевод строки. \ r возврат каретки. На разных платформах они имеют разные значения относительно новой строки. В окнах новая строка \ r \ n. В Linux \ n. В mac, \ r.

На практике вы помещаете их в любую строку, и это будет влиять на распечатку строки.

Palantir
источник