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

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

Ответ 1

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

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

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

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

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

РЕДАКТИРОВАТЬ: Это зависит от языка. Например, в С# и Java \n всегда означает Unicode U + 000A, который определяется как фид строки. В C и С++ вода несколько более грязная, так как значение является специфичным для платформы. Подробнее см. Комментарии.

Ответ 2

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

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

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

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

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.

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

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

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

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

  • \a (для предупреждения), который звонит на звонок телетайпа или делает звуковой сигнал терминала
  • \f (для подачи формы), который перемещается в начало следующей страницы
  • \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 и С++. Если вы будете опросить 100 из них, по крайней мере 99 скажут вам, что \n означает линию. Это не совсем правда. Большинство (возможно, все) реализаций C и С++ используют LF как магическое промежуточное значение для \n, но это деталь реализации. Для компилятора возможно использование другого значения. На самом деле, если набор символов хоста не является надмножеством ASCII (например, если он EBCDIC), то \n почти наверняка не будет LF.

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

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

Ответ 3

  • "\ r" = > Возврат
  • "\n" = > Newline или Linefeed (Семантика)

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

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

Ответ 4

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

Ответ 5

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

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

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

hai

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

Ответ 6

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

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

Ответ 7

\ r - возврат каретки; \n - новая строка (подача строки)... зависит от ОС от того, что каждый означает. Прочтите эту статью статью для получения дополнительной информации о различии между '\n' и '\ r\n'... в C.

Ответ 8

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

Ответ 9

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