Разница между \ n и \ r?


609

В чем разница между \n(новая строка) и\r (возврат каретки)?

В частности, есть ли практические различия между \nи \r? Есть ли места, где один должен использоваться вместо другого?


3
Все ответы довольно предсказуемы, но мне было бы интересно узнать, есть ли ПРАКТИЧЕСКИЕ различия между \ n и \ r. Есть ли места, где один должен быть использован поверх другого?
Влад Импала

9
ну да, текстовые файлы, содержащие только LF (перевод строки), не будут считаться завершенными в некоторых приложениях Windows, а текстовые файлы, оканчивающиеся на CRLF, будут иметь дополнительные символы, если их открыть в некоторых приложениях Linus.
павильон

2
да, \ r используется некоторыми консольными приложениями Linux для анимации вращающейся линии.
Мурали

8
Действительно ли все еще нормальный Mac EOL? Я уверен, что это было для "Классического" Mac, но я думал, что OS X имеет Unixified. (Показывает, насколько я знаком с Mac, а?)
Джон Y

11
исторически \ n использовалось для перемещения каретки вниз, в то время как \ r использовалось для перемещения каретки обратно в левую часть страницы.
Картик Горияволу

Ответы:


827

С точки зрения кода ASCII, это 3 - так как они 10 и 13 соответственно ;-).

А если серьезно, их много:

  • в Unix и всех Unix-подобных системах, \nэто код для конца строки,\r ничего особенного не означает
  • как следствие, в C и большинстве языков, которые каким-либо образом копируют его (даже удаленно), \nэто стандартная escape-последовательность для конца строки (переводится в / из специфичных для ОС последовательностей по мере необходимости)
  • в старых системах Mac (до OS X) \rвместо этого использовался код конца строки
  • в Windows (и многих старых ОС) код конца строки состоит из 2 символов \r\n, в этом порядке
  • как следствие (удивительно ;-) следствие (возвращаясь к операционным системам, намного более старым, чем Windows), \r\nэто стандартное окончание строки для текстовых форматов в Интернете
  • для электромеханических телетайпоподобных «терминалов» \rподает команду каретке вернуться влево, пока она не достигнет крайнего левого упора (медленная операция),\n дает команду ролику свернуть на одну строку (гораздо более быстрая операция) - вот почему у вас всегда есть \r раньше \n , чтобы ролик мог двигаться, пока каретка все еще движется влево! -) В Википедии есть более подробное объяснение .
  • для терминалов в символьном режиме (как правило, эмулируют даже более старые печатные устройства, как указано выше), в режиме raw, \r и \nдействует аналогично ( за исключением того, как с точкой зрения курсора, так как нет нет каретки или валика ;-)

На практике, в современном контексте записи в текстовый файл, вы всегда должны использовать \n(базовая среда выполнения переведет это, если вы находитесь в странной ОС, например, Windows ;-). Единственная причина использовать\r - если вы пишете в символьный терминал (или, скорее, в «консольное окно», эмулирующее его) и хотите, чтобы следующая строка, которую вы пишете, перезаписывала последнюю, которую вы только что написали (иногда используется для тупой анимации ascii) «эффекты, например, индикаторов выполнения) - это становится довольно устаревшим в мире GUI, хотя ;-).


12
Добавьте к истории в этом ответе: поскольку скорость линии увеличилась с 10 символов в секунду, для возврата каретки потребовалось более 2 символов, и после нее \0были добавлены дополнительные безвредные символы (обычно NUL, т. Е. ), \nЧтобы время. Это было прозрачно обработано ОС, поэтому вы не найдете его следов в унаследованном коде.
Марк Рэнсом

11
Как Windows "странная" операционная система?
mailmindlin

31
@mailmindlin - вы спрашиваете: «Как Windows -« странная »операционная система?». Ответ: больше, чем я могу легко сосчитать (при ношении носков, поэтому пальцы не допускаются :-). Все остальные выживающие ОС основаны на Unix ... Windows единственная, во многих отношениях. В контексте этого конкретного Q - это единственный, в котором два байта (\ n \ r) обозначены как канонический конец строки ... без какой-либо разумной причины, за исключением древне-исторических, объясненных в другом месте в потоке ... в любой другой ОС имеет один символ конца строки a5 (99% + из них `\ n ').
Алекс Мартелли

1
@nothingisneeded: например, tools.ietf.org/html/rfc5322 , который заменил RFC 2822, определяя формат сообщений электронной почты.
Кит Томпсон

3
Небольшой совет всем, кто в какой-то момент своей жизни напишет какой-то парсер - никогда не забывайте правильно обрабатывать окончание строк. У меня был довольно неприятный опыт с этим только потому, что я забыл о \r(я использую Linux). Когда я начал синтаксический анализ того, что казалось правильным файлом, мой парсер не удался, потому что файл, который я анализировал, был создан в Windows. : D Основной проблемой во всем , что является то , что ни один, \nили \rвидимы в том смысле , что, например a, ., и (т.д. символы.
rbaleksandar

122

Исторически a \nиспользовалось для перемещения каретки вниз, в то время \rкак для перемещения каретки назад к левой стороне страницы.


8
Возможно, не очень практичный ответ на компьютерный вопрос, но исторический лакомый кусочек в любом случае меня возбуждает.
Джон Y

1
Представьте, что вы похожи на то, когда вы нажимаете на печатную часть своей физической машины для печати слева, иначе. возвращение.
Джо Смо

2
\ n не сдвигает каретку вниз, он поворачивает ролик для перемещения бумаги вверх.
Родди

5
Все движения относительны. Бумага - это мой мир, и по отношению к нему карета движется вниз: P
Tster

2
FWIW, \ r все еще может быть «Возврат каретки» в современных системах. Рассмотрим этот код C, printf("abcdefghijlm\rNOP\n");скомпилированный с gcc-8 в OpenSuSe и запущенный на терминале, в результате вы получите следующие результаты NOPdefghijlm. \ R (возврат каретки) в строке приводит к перемещению курсора в начало строки (каретка), а символы, следующие за \ r (т. Е. «NOP»), перезаписывают то, что было ранее (т. Е. «Abc»)! Вы можете добиться такого же «движения каретки» с помощью backspace (\ b), как и в printf("abcdefghijlm\b\bNOP\n");которомabcdefghijNOP
GMc

36

Два разных персонажа.

\n используется как терминатор конца строки в текстовых файлах Unix

\r используется как терминатор конца строки в текстовых файлах Mac

\r\n (т.е. оба) используются для завершения строк в текстовых файлах Windows и DOS.


2
Обратите внимание, что есть / были компьютеры, которые использовали \ n \ r в качестве маркера конца строки, когда вы нажимали клавишу ВВОД, например, Acorn и RISC OS.
Андерс

9
Чтобы уточнить: \rдавно не было конца строки на Mac. С выпуском Mac OS X в 2001 году (который основан на Unix), \nтеперь используется.
Джаббакли

3
Но некоторые приложения, \rнапример MS Office 2011 Excel: сохранение CSV-файла (со всеми настройками по умолчанию), все же сохранят файл в кодировке ISO-8859-1 с \rокончанием -line.
CodeBrauer

24

Поскольку никто другой не упомянул об этом конкретно (они слишком молоды, чтобы знать / помнить?) - я подозреваю, что использование \r\nоригинальных пишущих машинок и подобных устройств.

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

Например, во времена строчных принтеров единственный способ сделать жирный текст состоял в том, чтобы сделать возврат каретки БЕЗ новой строки и напечатать те же символы поверх старых, добавив тем самым больше чернил, что делает его темнее (жирнее) , Когда механическая функция «новой строки» не работала в пишущей машинке, это было досадным результатом: вы могли печатать поверх предыдущей строки текста, если не обращали внимания.


3
Стандарт ASCII для новой строки - \ r \ n. (Помимо короткого перерыва, когда Bell Telephone получил контроль над комитетом по стандартам). В обмен на телефонную монополию Bell Telephone отказалась от бизнеса по обмену сообщениями (telegram, teletype) и не заботилась о существующем использовании стандарта. HTTP, HTML, PCDOS и MSDOS использовали стандарт ASCII. Компания Bell Telephone решила использовать нестандартные решения для Unix, потому что у них не было бизнеса, с которым можно было бы работать.
Дэвид

12

Два разных персонажа для разных операционных систем. Также это играет роль в передаваемых данных, TCP/IPкоторые требуют использования\r\n .

\n Юникс

\r макинтош

\r\n Windows и DOS.


10
Я думаю, что вы путаете с аппликативными протоколами, TCP / IP понятия не имеет о \ n и \ r.
Жан-Лу

4
TCP / IP не требует использования \ r \ n. Это требуется для различных протоколов, основанных на Telnet, включая SMTP, POP3, FTP, HTTP, ...
Маркиз Лорн,

9

Завершить,

В сценарии оболочки (bash) вы можете использовать \rдля отправки курсора впереди строки и, конечно же, \nдля установки курсора на новой строке.

Например, попробуйте:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • Первый «эхо» дисплей AA--AA
  • Второй : AA--AABB
  • Последний : BB--AABB

Но не забудьте использовать в -enкачестве параметров.


5

В окнах \ n перемещается в начало следующей строки. \ R перемещается в начало текущей строки, не переходя на следующую строку. Я использовал \ r в своих собственных консольных приложениях, где я тестирую некоторый код, и я не хочу, чтобы текст прокручивался вверх по моему экрану, поэтому вместо использования \ n после распечатки некоторого текста, скажем, с частотой кадров ( FPS), я буду печататьf ("% - 10d \ r", fps); Это вернет курсор в начало строки без перехода к следующей строке и позволит мне иметь на экране другую информацию, которая не прокручивается, пока частота кадров постоянно обновляется в той же строке (% -10 делает уверен, что вывод не менее 10 символов, выравнивание по левому краю, чтобы он заканчивался пробелами, перезаписывая все старые значения для этой строки). Это очень удобно для таких вещей, как это,

Немного истории

/ R означает «возврат» или «возврат каретки», который обязан своей истории пишущей машинке. Возврат каретки сдвинул вашу каретку до упора вправо, поэтому вы печатали в начале строки.

/ N означает «новая строка», опять же, с тех дней, когда вы печатали, на новую строку. Не обязательно к началу, хотя, поэтому некоторые операционные системы приняли необходимость как возврата / r, так и перевода строки / n, так как это было в порядке, в котором печатная машинка делала это. Это также объясняет старые 8-битные компьютеры, которые использовали иметь «Return» вместо «Enter» из «возврата каретки», что было знакомо.


1

Просто чтобы добавить к путанице, я работал над простым текстовым редактором, используя элемент TextArea на HTML-странице в браузере. В ожидании проблем совместимости в отношении CR / LF, я написал код для проверки платформы и использовал любое соглашение о переводе строки, применимое к платформе.

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

Для теста я набрал следующий текст:

Привет, Мир [войти]

Прощай, жестокий мир

Когда я исследовал текстовые данные, полученная последовательность байтов была такой:

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a

Теперь, большинство людей, которые смотрят на это и видят 0a, но не 0d байтов, думают, что этот вывод был получен на платформе Unix / Linux. Но вот в чем проблема: эту последовательность я получил в Google Chrome на Windows 7 64-битной версии.

Итак, если вы используете элемент TextArea и изучаете текст, ПРОВЕРЬТЕ вывод, как я делал выше, чтобы убедиться, какие фактические байты символов возвращаются из вашей TextArea. Я еще не видел, отличается ли это на других платформах или в других браузерах, но стоит иметь в виду, если вы выполняете обработку текста с помощью JavaScript, и вам нужно сделать эту платформу для обработки текста независимой.

Соглашения, описанные в постах выше, применяются к выводу консоли , но элементы HTML, по-видимому, соответствуют соглашению UNIX / Linux. Если кто-то не обнаружит иначе на другой платформе / браузере.


0
#include <stdio.h>

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

давайте возьмем этот пример, попробуйте поставить \ n вместо \ r, это не сработает, и попробуем угадать, почему?


1
Это работает, только если ваша подчеркивающая ОС отправляет \ r \ n при нажатии клавиши ENTER, например, MS DOS, DECS TOPS-10, CP / M, RT-11 и т. Д. В ОС: например, Multic, Unix и Unix-like ( Linux, Minix и т. Д.). Клавиша ENTER BeOS, RISCOS и т. Д. Отправляет только символ \ n.
Андерс

1
ааа, да, старые добрые времена, когда на клавишах было и то Returnи другое Enter. Даже моя современная беспроводная клавиатура все еще показывает стрелку «вниз» и «назад» на старой Returnклавише (которая теперь называется «Enter», чтобы соответствовать Enterклавише цифровой клавиатуры , которая не показывает стрелку)
ничего лишнего

0

В чем разница между \ n (перевод строки) и \ r (возврат каретки)?

В частности, есть ли практические различия между \nи \r? Есть ли места, где один должен использоваться вместо другого?


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

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

Программа просто выполняет итерацию, чтобы вывести предложение в консоль, итерацию цикла for.


Программа Newline:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \n";   // Notice `\n` at the end.
    }
    return 0;
}

Вывод:

1.Walkthrough of the for-loop
2.Walkthrough of the for-loop
3.Walkthrough of the for-loop
4.Walkthrough of the for-loop
5.Walkthrough of the for-loop
6.Walkthrough of the for-loop
7.Walkthrough of the for-loop

Обратите внимание, что этот результат не будет предоставлен ни в одной системе, вы выполняете этот код C ++. Но это должно работать для самых современных систем. Читайте ниже для более подробной информации.


Теперь та же самая программа, но с той разницей, которая \nзаменяется \rв конце последовательности печати.

Программа возврата каретки:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \r";   // Notice `\r` at the end.
    }
    return 0;
}

Вывод:

7.Walkthrough of the for-loop 

Заметили, где разница? Разница в том, что когда вы используете escape-последовательность возврата каретки \rв конце каждой последовательности печати, следующая итерация этой последовательности не попадает в следующую текстовую строку - в конце каждой последовательности печати курсор не прыгнул на * начало следующей строки.

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

* Примечание: A \nне обязательно переходить к началу следующей текстовой строки. В некоторых, в целом более старых, операционных системах результатом \nсимвола новой строки может быть то, что он переходит в любую точку следующей строки, а не только в начало. Вот почему они должны использовать, \r \nчтобы получить в начале следующей текстовой строки.


Этот эксперимент показал нам разницу между переводом строки и возвратом каретки в контексте вывода итерации последовательности печати.

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

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

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