В чем разница между \ r и \ n?

Как разные \r и \n ? Я думаю, что это имеет какое-то отношение к Unix vs. Windows и Mac, но я не уверен, как они отличаются друг от друга и что искать / сопоставлять в regexes.

Они разные персонажи. \r – возврат каретки, а \n – строка.

На «старых» принтерах, \r послал печатающую головку назад к началу строки, и \n переместил бумагу на одну строку. Поэтому необходимо было начать печать на следующей строке.

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

Что еще более важно, Unix имеет тенденцию использовать \n в качестве разделителя строк; Windows обычно использует \r\n как разделитель строк и Mac (до OS 9), используемый для использования \r в качестве разделителя строк. (Mac OS X – Unix-y, поэтому вместо этого используется \n ; могут быть некоторые ситуации совместимости, где вместо этого используется \r ).

Для получения дополнительной информации см. Статью новой статьи в Википедии .

EDIT: это зависит от языка. Например, в C # и Java \n всегда означает Unicode U + 000A, который определяется как фид строки. В C и C ++ вода несколько более грязная, так как значение является специфичным для платформы. См. Комментарии для деталей.

В C и C ++ \n – это понятие, \r – символ, а \r\n (почти всегда) – ошибка переносимости.

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

Когда вы хотите закончить текущую строку и начать на следующей строке, вам нужно сделать два отдельных шага:

  1. переместите печатающую головку назад в начало строки, затем
  2. переместите его на следующую строку.

ASCII кодирует эти действия как два различных управляющих символа:

  • \x0D (CR) переводит печатающую головку назад в начало строки. (Unicode кодирует это как U+000D CARRIAGE RETURN .)
  • \x0A (LF) перемещает печатающую головку до следующей строки. (Unicode кодирует это как U+000A LINE FEED .)

Во времена телетайпов и ранних технологий принтеры люди фактически воспользовались тем, что это были две отдельные операции. Отправляя CR, не следуя ему с помощью LF, вы можете печатать по уже напечатанной строке. Это позволило использовать эффекты, такие как акценты, жирный шрифт и подчеркивание. Некоторые системы запечатывали несколько раз, чтобы предотвратить появление паролей в печатном виде. На ранних последовательных терминалах CRT CR был одним из способов управления позицией курсора, чтобы обновить текст уже на экране.

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

  • Варианты Unix (включая современные версии Mac) используют только символ LF для обозначения новой строки.
  • Старые (pre-OSX) файлы Macintosh использовали только символ CR для обозначения новой строки.
  • VMS, CP / M, DOS, Windows и многие сетевые протоколы по- прежнему ожидают как: CR LF.
  • Старые системы IBM, которые использовали EBCDIC, стандартизованные на NL, – символ, который даже не существует в наборе символов ASCII. В Unicode NL – U+0085 NEXT LINE , но фактическое значение EBCDIC равно 0x15 .

Почему разные системы выбирают разные методы? Просто потому, что не было универсального стандарта. Если ваша клавиатура, вероятно, говорит «Ввод», более старые клавиатуры говорили «Возврат», что было коротким для возврата каретки. Фактически, на последовательном терминале нажатие кнопки Return фактически отправляет символ CR. Если вы пишете текстовый редактор, было бы заманчиво просто использовать этот символ, поскольку он пришел с терминала. Возможно, поэтому старшие Маки использовали только CR.

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

  • U+2028 LINE SEPARATOR
  • U+2029 PARAGRAPH SEPARATOR

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

  • \a (для предупреждения), который звонит на звонок телетайпа или делает звуковой сигнал терминала
  • \f (для формы feed), который перемещается в начало следующей страницы
  • \t (для вкладки), которая перемещает печатающую головку в следующую горизонтальную вкладку

(Этот список намеренно неполный.)

Это сопоставление происходит во время компиляции – компилятор видит \a и помещает любое волшебное значение для вызова звонка.

Обратите внимание, что большинство этих мнемоник имеют прямые корреляции с кодами управления ASCII. Например, \a будет отображаться в 0x07 BEL . Компилятор может быть написан для системы, которая использовала нечто иное, чем ASCII для набора символов хоста (например, EBCDIC). Большинство управляющих кодов, которые имеют определенную мнемонику, можно сопоставить для управления кодами в других наборах символов.

Ура! Переносимость!

Ну, почти. В C я мог бы написать printf("\aHello, World!"); который вызывает звонок (или звуковой сигнал) и выводит сообщение. Но если бы я хотел напечатать что-то на следующей строке, мне все равно нужно было знать, что требуется платформе хоста для перехода к следующей строке вывода. CR LF? CR? LF? NL? Что-то другое? Так много для переносимости.

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

Отлично, так какой особый характер?

Ну, это тоже зависит от реализации, но есть независимый от реализации способ: \n . Его обычно называют «символом новой строки».

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

\n отличается от всех других символов обратной косой черты, потому что есть два сопоставления. Это двухэтапное сопоставление делает \n существенно отличным от \r , что является просто отображением времени компиляции в CR (или наиболее похожим управляющим кодом в любом базовом наборе символов).

Это вызывает множество программистов на C и C ++. Если вы будете опросить 100 из них, по крайней мере 99 скажут вам, что \n означает линию. Это не совсем правда. Большинство (возможно, все) реализаций C и C ++ используют LF как магическое промежуточное значение для \n , но это детализация реализации. Для компилятора возможно использование другого значения. На самом деле, если набор символов хоста не является надмножеством ASCII (например, если это EBCDIC), то \n почти наверняка не будет LF.

Итак, в C и C ++:

  • \r – буквально возврат каретки.
  • \n – волшебное значение, которое переводится (в текстовом режиме) во время выполнения в / из семантики новой строки хоста.
  • \r\n почти всегда является ошибкой переносимости. В текстовом режиме это преобразуется в CR, за которым следует последовательность новой строки платформы – вероятно, не то, что предназначено. В двоичном режиме это преобразуется в CR, за которым следует некоторое магическое значение, которое может быть не LF – возможно, не то, что предназначено.
  • \x0A – самый переносимый способ указать ASCII LF, но вы хотите сделать это только в двоичном режиме. Большинство реализаций в текстовом режиме будут обрабатывать это как \n .
  • “\ r” => Возврат
  • “\ n” => Newline или Linefeed (семантика)

  • Системы на основе Unix используют только «\ n» для завершения строки текста.

  • Dos использует «\ r \ n» для завершения строки текста.
  • Некоторые другие машины использовали только «\ r». (Commodore, Apple II, Mac OS до OS X и т. Д.)

Короче \ r имеет значение ASCII 13 (CR) и \ n имеет значение ASCII 10 (LF). Mac использует CR как разделитель строк (по крайней мере, раньше, я не уверен в современных маках), * nix использует LF, а Windows использует оба (CRLF).

\r используется для указания начала строки и может заменить текст оттуда, например

 main() { printf("\nab"); printf("\bsi"); printf("\rha"); } 

Производит этот вывод:

 hai 

\n – для новой строки.

В дополнение к ответу @Jon Skeet:

Традиционно Windows использовала \ r \ n, Unix \ n и Mac \ r, однако более новые Mac используют \ n, поскольку они основаны на unix.

в C # я нашел, что они используют \ r \ n в строке.

\ r – Возврат каретки; \ n – новая строка (подача строки) … зависит от ОС от того, что каждый означает. Прочтите эту статью, чтобы узнать больше о различиях между «\ n» и «\ r \ n» … в C.

\ r используется для возврата каретки. (Значение ASCII равно 13) \ n используется для новой строки. (Значение ASCII равно 10)

Давайте будем гением компьютера.